Bla*_* B. 10 t-sql sql-server pivot sql-server-2012
我有以下示例数据:
Id Name Category
-----------------------
1 Joe A
2 Joe B
3 Joe D
4 Mary A
5 Mary C
6 Mary D
Run Code Online (Sandbox Code Playgroud)
我想显示一个人所属的类别,如下所示:
Name CategoryA CategoryB CategoryC CategoryD
--------------------------------------------------
Joe X X X
Mary X X X
Run Code Online (Sandbox Code Playgroud)
可以使用1和0来代替X和空白.
这对我来说就像一个PIVOT问题.
Tar*_*ryn 28
您可以通过多种方式转换数据.有些使用聚合函数而有些则没有.但即使您正在旋转字符串,您仍然可以应用聚合.
与CASE汇总:
select name,
max(case when category = 'A' then 'X' else '' end) CategoryA,
max(case when category = 'B' then 'X' else '' end) CategoryB,
max(case when category = 'C' then 'X' else '' end) CategoryC,
max(case when category = 'D' then 'X' else '' end) CategoryD
from yourtable
group by name
Run Code Online (Sandbox Code Playgroud)
静态枢轴:
PIVOT即使值是字符串,您仍然可以使用该函数转换数据.如果您有已知数量的类别,则可以对查询进行硬编码:
select name,
coalesce(A, '') CategoryA,
coalesce(B, '') CategoryB,
coalesce(C, '') CategoryC,
coalesce(C, '') CategoryD
from
(
select name, category, 'X' flag
from yourtable
) d
pivot
(
max(flag)
for category in (A, B, C, D)
) piv
Run Code Online (Sandbox Code Playgroud)
动态枢轴:
如果您有不明数量的类别,那么您可以使用动态SQL:
DECLARE @cols AS NVARCHAR(MAX),
@colsNull AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(category)
from yourtable
group by category
order by category
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @colsNull = STUFF((SELECT ', coalesce(' + QUOTENAME(category)+', '''') as '+QUOTENAME('Category'+category)
from yourtable
group by category
order by category
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT name, ' + @colsNull + '
from
(
select name, category, ''X'' flag
from yourtable
) x
pivot
(
max(flag)
for category in (' + @cols + ')
) p '
execute(@query)
Run Code Online (Sandbox Code Playgroud)
多个联接:
select c1.name,
case when c1.category is not null then 'X' else '' end as CategoryA,
case when c2.category is not null then 'X' else '' end as CategoryB,
case when c3.category is not null then 'X' else '' end as CategoryC,
case when c4.category is not null then 'X' else '' end as CategoryD
from yourtable c1
left join yourtable c2
on c1.name = c2.name
and c2.category = 'B'
left join yourtable c3
on c1.name = c3.name
and c3.category = 'C'
left join yourtable c4
on c1.name = c4.name
and c4.category = 'D'
where c1.category = 'A'
Run Code Online (Sandbox Code Playgroud)
所有查询都会给出结果:
| NAME | CATEGORYA | CATEGORYB | CATEGORYC | CATEGORYD |
--------------------------------------------------------
| Joe | X | X | | X |
| Mary | X | | X | X |
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21384 次 |
| 最近记录: |