sql—尝试将多个键id组合到一行中,但列中的值不同

wa7juj8i  于 2021-08-01  发布在  Java
关注(0)|答案(3)|浏览(423)

tsql-sql服务器
我正在根据非常具体的要求编写一份报告。我试图将一个键id的倍数合并到一行中,但是在某些列中有不同的值,所以groupby不起作用。

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

消息102,级别15,状态1,第4行“>”附近语法不正确。
以下是结果(没有第一个案例)。注:第三人称有多种种族。

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


这是意料之中的,但目标是将多个种族分配给10(多个)的种族id。我还想把它们放在一条线上。
最终结果如下:

所以我的问题有两个。如果候选人有两个以上的种族,则将记录分配到10的种族。我还需要将重复的personid分组到一行中,同时显示列的所有结果。

0aydgbwb

0aydgbwb1#

这将带来您想要的结果:

  1. SELECT Person_ID
  2. , ISNULL(ID_Dummy,Ethnicity_ID) Ethnicity_ID
  3. , MAX(Black) Black
  4. , MAX(White) White
  5. , MAX(Asian) Asian
  6. FROM @T T
  7. OUTER APPLY(SELECT MAX(10) FROM @T T2
  8. WHERE T2.Person_ID = T.Person_ID
  9. AND T2.Ethnicity_ID <> T.Ethnicity_ID
  10. )EthnicityOverride(ID_Dummy)
  11. GROUP BY Person_ID, ISNULL(ID_Dummy,Ethnicity_ID)
k0pti3hp

k0pti3hp2#

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

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

你可能想要 max() 而不是 sum() . 我也没有得到期望结果中第二列的逻辑-也许这只是 count(*) .

ohtdti5x

ohtdti5x3#

这就是我的方法

  1. SELECT
  2. person_id,
  3. CASE WHEN flag = 1 THEN Ethnicity_Id ELSE 10 END AS Ethnicity_Id,
  4. [1] as black,
  5. [2] as white,
  6. [3] as asian
  7. FROM
  8. (
  9. SELECT
  10. person_id,
  11. Ethnicity_Id as columns,
  12. 1 as n,
  13. MAX(Ethnicity_Id) over(PARTITION BY person_id) as Ethnicity_Id,
  14. COUNT(Ethnicity_Id) over(PARTITION BY person_id) as flag
  15. FROM
  16. #example
  17. ) AS SourceTable
  18. PIVOT
  19. (
  20. MAX(n) FOR columns IN ([1], [2], [3])
  21. ) AS PivotTable;

将id列透视成多个列,使用常量1使其与预期结果一致。
使用max(种族标识)和partition by来获取原始种族标识
使用count(种族标识)标记是否需要替换种族标识
对于10 bc,该个人id的行数超过1行
如果您需要添加更多的种族,请在中添加ID ... IN ([1], [2], [3]) ... 在选择

展开查看全部

相关问题