SQL Server:如何计算不同的记录并将其分隔为列?

SQL Server:如何计算不同的记录并将其分隔为列?,sql,sql-server,Sql,Sql Server,我目前正在使用SQL Server 2016从表中进行选择,以输出不同的布局。下表项目统计数据: code_no | code_status | code_category --------+-------------+-------------- a123 | x | error1 a123 | y | error1 a123 | z | error1 a123 | x | error1 a

我目前正在使用SQL Server 2016从表中进行选择,以输出不同的布局。下表
项目统计数据

code_no | code_status | code_category
--------+-------------+--------------
a123    |      x      | error1
a123    |      y      | error1
a123    |      z      | error1
a123    |      x      | error1
a123    |      y      | error2
b123    |      x      | error2
b123    |      y      | error2
c123    |      y      | error1
c123    |      z      | error1
我正在尝试使用GROUPBY或甚至partition by,但无法得到结果。我希望获得以下输出:

code_no | x | y | z | code_category
--------+---+---+---+---------------
a123    | 2 | 1 | 1 | error1
a123    | 0 | 1 | 0 | error2
b123    | 1 | 1 | 0 | error2
c123    | 0 | 1 | 2 | error1
基本上,结果将按
code\u no
code\u类别
分组,并显示每个
code\u状态
,即x、y和z作为一列,并显示这些列中出现的次数

感谢您在获取输出时提供的任何帮助或指导。我尝试过使用GROUPBY,但布局没有将代码状态拆分为单个列

谢谢 A.Fai

您可以尝试使用聚合函数条件来生成透视表

select code_no,
        SUM(CASE WHEN code_status = 'x' THEN 1 ELSE 0 END) x,
        SUM(CASE WHEN code_status = 'y' THEN 1 ELSE 0 END) y,
        SUM(CASE WHEN code_status = 'z' THEN 1 ELSE 0 END) z,
        code_category 
from t
group by code_no,code_category 

[结果]

| code_no | x | y | z | code_category |
|---------|---|---|---|---------------|
|    a123 | 2 | 1 | 1 |        error1 |
|    c123 | 0 | 1 | 1 |        error1 |
|    a123 | 0 | 1 | 0 |        error2 |
|    b123 | 1 | 1 | 0 |        error2 |

使用大小写表达式

查询

select [code_no],
sum(case [code_status] when 'x' then 1 end) as [x],
sum(case [code_status] when 'y' then 1 end) as [y],
sum(case [code_status] when 'z' then 1 end) as [z],
[code_category]
from [your_table_name]
group by [code_no], [code_category];

请尝试以下查询-:

select code_no,
SUM(case when code_status='x' then 1 else 0 end) as [X],
SUM(case when code_status='y' then 1 else 0 end) as [Y],
SUM(case when code_status='z' then 1 else 0 end) as [Z],
code_category 
from 
[YOUR_TABLE_NAME]
group by code_no,code_category 
order by code_no 
使用静态枢轴-:

select code_no,[X],[Y],[Z],code_category
from [YOUR_TABLE_NAME] 
PIVOT
(
COUNT(code_status) for code_status in ([x],[y],[z])
)a
order by code_no
DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX)

SELECT @cols = STUFF((SELECT distinct  ',' + QUOTENAME(code_status) 
                    FROM [YOUR_TABLE_NAME]
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SELECT @query = 
'SELECT code_no,'+@cols+',code_category FROM [YOUR_TABLE_NAME]
PIVOT 
(
    count(code_status)
    for [code_status] in (' + @cols + ')
) P order by code_no'

EXEC SP_EXECUTESQL @query
使用动态枢轴-:

select code_no,[X],[Y],[Z],code_category
from [YOUR_TABLE_NAME] 
PIVOT
(
COUNT(code_status) for code_status in ([x],[y],[z])
)a
order by code_no
DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX)

SELECT @cols = STUFF((SELECT distinct  ',' + QUOTENAME(code_status) 
                    FROM [YOUR_TABLE_NAME]
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SELECT @query = 
'SELECT code_no,'+@cols+',code_category FROM [YOUR_TABLE_NAME]
PIVOT 
(
    count(code_status)
    for [code_status] in (' + @cols + ')
) P order by code_no'

EXEC SP_EXECUTESQL @query