SQL Server:如何计算不同的记录并将其分隔为列?
我目前正在使用SQL Server 2016从表中进行选择,以输出不同的布局。下表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
项目统计数据:
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