【问题标题】:Trying to combine multiples of a key ID into single row, but with different values in columns尝试将多个键 ID 组合成单行,但列中的值不同
【发布时间】:2020-06-30 16:07:46
【问题描述】:

TSQL - SQL 服务器

我正在根据非常具体的要求构建报告。我正在尝试将多个键 ID 组合成单行,但某些列中的值不同,因此 GROUP BY 不起作用。

SELECT count(tt.Person_ID) as CandCount, tt.Person_ID, 
CASE e.EthnicSuperCategoryID WHEN CandCount > 1 THEN 10 ELSE e.EthnicSuperCategoryID END as EthnicSuperCategoryID,
CASE e.Ethnicity_Id WHEN 1 THEN 1 ELSE 0 END as Black ,
CASE e.Ethnicity_Id WHEN 2 THEN 1 ELSE 0 END as White ,
CASE e.Ethnicity_Id WHEN 3 THEN 1 ELSE 0 END as Asian,
etc
FROM T_1 TT
JOINS
WHERE
GROUP

消息 102,级别 15,状态 1,第 4 行 '>' 附近的语法不正确。

这是结果(没有第一个 CASE)。注意人 3 陈述了多个种族。

SELECT count(tt.Person_ID) as CandCount, tt.Person_ID, 
CASE e.Ethnicity_Id WHEN 1 THEN 1 ELSE 0 END as Black ,
CASE e.Ethnicity_Id WHEN 2 THEN 1 ELSE 0 END as White ,
CASE e.Ethnicity_Id WHEN 3 THEN 1 ELSE 0 END as Asian,
etc
FROM T_1 TT
JOINS
WHERE
GROUP

这是意料之中的,但目标是将多个种族分配给 Ethnicity_Id 为 10(多个)。我还希望它们在一行中分组。

所以最终的结果应该是这样的:

所以我的问题有两个方面。如果候选人有超过 2 个种族,则将记录分配给 Ethnicity_Id 为 10。我还需要将重复的人员 ID 分组到一行中,同时显示列的所有结果。

【问题讨论】:

    标签: sql sql-server tsql pivot reporting


    【解决方案1】:

    这应该会带来你想要的结果:

    SELECT Person_ID
         , ISNULL(ID_Dummy,Ethnicity_ID) Ethnicity_ID
         , MAX(Black) Black
         , MAX(White) White
         , MAX(Asian) Asian
      FROM @T T
     OUTER APPLY(SELECT MAX(10) FROM @T T2 
                   WHERE T2.Person_ID = T.Person_ID 
                     AND T2.Ethnicity_ID <> T.Ethnicity_ID
                )EthnicityOverride(ID_Dummy)
     GROUP BY Person_ID, ISNULL(ID_Dummy,Ethnicity_ID)
    

    【讨论】:

      【解决方案2】:

      您需要条件聚合。您的查询不完整,但想法是:

      select 
          person_id, 
          sum(case ethnicity_id = 1 then 1 else 0 end) as black,
          sum(case ethnicity_id = 2 then 1 else 0 end) as white,
          sum(case ethnicity_id = 3 then 1 else 0 end) as asian
      from ...
      where ...
      group by person_id
      

      您可能需要max() 而不是sum()。此外,我没有得到所需结果中第二列的逻辑 - 也许这只是count(*)

      【讨论】:

        【解决方案3】:

        这将是我的方法

        SELECT 
            person_id,
            CASE WHEN flag = 1 THEN Ethnicity_Id ELSE 10 END AS Ethnicity_Id,
            [1] as black,
            [2] as white,
            [3] as asian
        FROM  
        (
            SELECT 
                person_id, 
                Ethnicity_Id as columns,
                1 as n,
                MAX(Ethnicity_Id) over(PARTITION BY person_id) as Ethnicity_Id,
                COUNT(Ethnicity_Id) over(PARTITION BY person_id) as flag
            FROM 
                #example
        ) AS SourceTable  
        PIVOT  
        (  
            MAX(n) FOR columns IN ([1], [2], [3])  
        ) AS PivotTable;
        
        • 使用常量将 Ethnicity_Id 列转换为多个列 1 让它抱怨你的预期结果。
        • 使用 Max(Ethnicity_Id) 和 Partition By 来获取原始 Ethnicity_Id
        • 使用 Count(Ethnicity_Id) 标记是否需要替换 Ethnicity_Id
          公元前 10 年,该 person_id 的行数超过 1 行

        如果您需要添加更多种族,请在 ... IN ([1], [2], [3]) ... 和选择中添加 id

        【讨论】:

        • 如果您尝试一下,请告诉我 DaftLeech 响应的表现是好是坏。
        猜你喜欢
        • 2012-10-12
        • 1970-01-01
        • 2015-02-15
        • 1970-01-01
        • 1970-01-01
        • 2015-06-12
        • 1970-01-01
        • 1970-01-01
        • 2021-07-16
        相关资源
        最近更新 更多