Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 尝试将多个键ID组合到一行中,但列中的值不同_Sql_Sql Server_Tsql_Pivot_Reporting - Fatal编程技术网

Sql 尝试将多个键ID组合到一行中,但列中的值不同

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

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 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响应的性能是更好还是更差。