Sql 尝试将多个键ID组合到一行中,但列中的值不同
TSQL-SQL服务器 我正在根据非常具体的要求编写一份报告。我试图将多个键ID组合到一行中,但某些列中的值不同,所以GROUPBY不起作用Sql 尝试将多个键ID组合到一行中,但列中的值不同,sql,sql-server,tsql,pivot,reporting,Sql,Sql Server,Tsql,Pivot,Reporting,TSQL-SQL服务器 我正在根据非常具体的要求编写一份报告。我试图将多个键ID组合到一行中,但某些列中的值不同,所以GROUPBY不起作用 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
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
Msg 102,15级,状态1,第4行
“>”附近的语法不正确
以下是结果(没有第一个案例)。注:第三人陈述了多种民族
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
这是意料之中的,但目标是将多个种族分配给10(多个)的种族Id。我还希望将它们分组在一行上
因此最终结果如下所示:
所以我的问题是双重的。如果候选人有两个以上的种族,则将记录分配给种族Id为10的人。我还需要将重复的个人ID分组到一行中,同时显示列的所有结果。您需要条件聚合。您的查询不完整,但想法是:
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(*)
这应该会得到所需的结果:
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)
选择人员\u ID
,ISNULL(ID\u Dummy,种族\u ID)种族\u ID
,MAX(黑色)黑色
,MAX(白色)白色
,MAX(亚洲)亚洲
来自@T
外部应用(从@T T2中选择最大值(10
其中T2.Person\u ID=T.Person\u ID
T2.民族性T.民族性
)种族覆盖(ID\U虚拟)
按个人ID分组,ISNULL(ID\u虚拟,种族\u ID)
这将是我的方法
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;
- 使用常量将Id列旋转为多个列 1让它抱怨你的预期结果
- 使用带有分区依据的Max(Id)来获取原始 种族歧视
- 使用计数(种族标识)标记是否需要更换种族标识
在公元前10年,该个人的id超过1行
如果您需要添加更多种族,请在
中添加ID。。。在([1]、[2]、[3])…
和选择中,如果您尝试,请告诉我DaftLeech响应的性能是更好还是更差。