gpt4 book ai didi

pivot - SQL 将行转置为列(按键变量分组)?

转载 作者:行者123 更新时间:2023-12-01 22:56:59 25 4
gpt4 key购买 nike

我正在尝试将行转置为列,并按唯一标识符 (CASE_ID) 进行分组。

我有一个具有以下结构的表:

CASE_ID   AMOUNT   TYPE  
100 10 A
100 50 B
100 75 A
200 33 B
200 10 C

我正在尝试查询它以生成此结构...

| CASE_ID | AMOUNT1 | TYPE1 | AMOUNT2 | TYPE2 | AMOUNT3 |  TYPE3 |
|---------|---------|-------|---------|-------|---------|--------|
| 100 | 10 | A | 50 | B | 75 | A |
| 200 | 33 | B | 10 | C | (null) | (null) |

(假设数据集更大,具有大量 CASE_ID、TYPE 和 AMOUNT 可能值)

我尝试使用数据透视表,但我不需要聚合函数(只是尝试重组数据)。现在我尝试以某种方式使用 row_number 但不确定如何使用。

我基本上正在尝试复制名为 Casestovars 的 SPSS 命令,但需要能够在 SQL 中执行此操作。谢谢。

最佳答案

您可以通过使用 row_number() 创建序列号,然后使用带有 CASE 表达式的聚合函数来获取结果:

select case_id,
max(case when seq = 1 then amount end) amount1,
max(case when seq = 1 then type end) type1,
max(case when seq = 2 then amount end) amount2,
max(case when seq = 2 then type end) type2,
max(case when seq = 3 then amount end) amount3,
max(case when seq = 3 then type end) type3
from
(
select case_id, amount, type,
row_number() over(partition by case_id
order by case_id) seq
from yourtable
) d
group by case_id;

参见SQL Fiddle with Demo .

如果您使用的数据库产品具有 PIVOT 功能,那么您可以将 row_number() 与 PIVOT 结合使用,但首先我建议您对 amount 进行逆透视首先输入列。 SQL Server 中有限数量值的基本语法是:

select case_id, amount1, type1, amount2, type2, amount3, type3
from
(
select case_id, col+cast(seq as varchar(10)) as col, value
from
(
select case_id, amount, type,
row_number() over(partition by case_id
order by case_id) seq
from yourtable
) d
cross apply
(
select 'amount', cast(amount as varchar(20)) union all
select 'type', type
) c (col, value)
) src
pivot
(
max(value)
for col in (amount1, type1, amount2, type2, amount3, type3)
) piv;

参见SQL Fiddle with Demo .

如果您有未知数量的值,则可以使用动态 SQL 来获取结果 - SQL Server 语法如下:

DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(col+cast(seq as varchar(10)))
from
(
select row_number() over(partition by case_id
order by case_id) seq
from yourtable
) d
cross apply
(
select 'amount', 1 union all
select 'type', 2
) c (col, so)
group by col, so
order by seq, so
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')

set @query = 'SELECT case_id,' + @cols + '
from
(
select case_id, col+cast(seq as varchar(10)) as col, value
from
(
select case_id, amount, type,
row_number() over(partition by case_id
order by case_id) seq
from yourtable
) d
cross apply
(
select ''amount'', cast(amount as varchar(20)) union all
select ''type'', type
) c (col, value)
) x
pivot
(
max(value)
for col in (' + @cols + ')
) p '

execute sp_executesql @query;

参见SQL Fiddle with Demo 。每个版本都会给出结果:

| CASE_ID | AMOUNT1 | TYPE1 | AMOUNT2 | TYPE2 | AMOUNT3 |  TYPE3 |
|---------|---------|-------|---------|-------|---------|--------|
| 100 | 10 | A | 50 | B | 75 | A |
| 200 | 33 | B | 10 | C | (null) | (null) |

关于pivot - SQL 将行转置为列(按键变量分组)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19457054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com