具有多个聚合值的数据透视 table
Pivot table with multiple aggregate value
我正试图在 table 以下进行调整,这可能吗?
但如果我按代码聚合它们,值 A 或 B 将因此消失。
来自
Name
Code
Value
Kevin
Code1
A
Kevin
Code1
B
Kevin
Code2
C
Kevin
Code3
D
Tom
Code1
E
Tom
Code2
F
Tom
Code3
G
到
Name
Code1
Code2
Code3
Kevin
A
C
D
Kevin
B
C
D
Tom
E
F
G
查询我试过了....
DECLARE @cols AS NVARCHAR(max), @query AS NVARCHAR(max);
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.Code)
FROM Table c
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(max)'),1,1,'')
set @query = 'with mapping as
(SELECT
Name
, ' + @cols + '
from (select name
, Code
, Value
from Table) x
pivot
(max(Code)
for Name in (' + @cols + ')) p )'
execute(@query)
自己试过,但只能达到以下水平
Name
Code1
Code2
Code3
Kevin
A or B(depend on aggregated max or min)
C
D
Tom
E
F
G
提前致谢
这是一个固定的列列表版本。您应该使用此模板构建您的动态模板。
select Name
, first_value(Code1) over(partition by Name order by rn) Code1
, first_value(Code2) over(partition by Name order by rn) Code2
, first_value(Code3) over(partition by Name order by rn) Code3
from (
select t.* , row_number() over(partition by Name, Code order by Value) rn
from tbl t
) t
pivot (max(value) for code in (Code1, Code2, Code3)) p
order by Name;
使用row_number()
和一些算术:
select name,
max(case when code = 'Code1' then value end) as code1,
max(case when code = 'Code2' then value end) as code2,
max(case when code = 'Code3' then value end) as code3
from (select t.*,
row_number() over (partition by name, code order by (select null)) as seqnum
from t
) t
group by name, seqnum;
不清楚动态 SQL 是由于动态列数还是试图解决此问题。但这也可以适用于动态 SQL。
我正试图在 table 以下进行调整,这可能吗?
但如果我按代码聚合它们,值 A 或 B 将因此消失。
来自
Name | Code | Value |
---|---|---|
Kevin | Code1 | A |
Kevin | Code1 | B |
Kevin | Code2 | C |
Kevin | Code3 | D |
Tom | Code1 | E |
Tom | Code2 | F |
Tom | Code3 | G |
到
Name | Code1 | Code2 | Code3 |
---|---|---|---|
Kevin | A | C | D |
Kevin | B | C | D |
Tom | E | F | G |
查询我试过了....
DECLARE @cols AS NVARCHAR(max), @query AS NVARCHAR(max);
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.Code)
FROM Table c
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(max)'),1,1,'')
set @query = 'with mapping as
(SELECT
Name
, ' + @cols + '
from (select name
, Code
, Value
from Table) x
pivot
(max(Code)
for Name in (' + @cols + ')) p )'
execute(@query)
自己试过,但只能达到以下水平
Name | Code1 | Code2 | Code3 |
---|---|---|---|
Kevin | A or B(depend on aggregated max or min) | C | D |
Tom | E | F | G |
提前致谢
这是一个固定的列列表版本。您应该使用此模板构建您的动态模板。
select Name
, first_value(Code1) over(partition by Name order by rn) Code1
, first_value(Code2) over(partition by Name order by rn) Code2
, first_value(Code3) over(partition by Name order by rn) Code3
from (
select t.* , row_number() over(partition by Name, Code order by Value) rn
from tbl t
) t
pivot (max(value) for code in (Code1, Code2, Code3)) p
order by Name;
使用row_number()
和一些算术:
select name,
max(case when code = 'Code1' then value end) as code1,
max(case when code = 'Code2' then value end) as code2,
max(case when code = 'Code3' then value end) as code3
from (select t.*,
row_number() over (partition by name, code order by (select null)) as seqnum
from t
) t
group by name, seqnum;
不清楚动态 SQL 是由于动态列数还是试图解决此问题。但这也可以适用于动态 SQL。