我正在嘗試將行轉換為列并將型別與標題連接起來以獲得一行。
我的桌子:
| 型別 | 姓名 | 數 | 年齡 | 日期A | 日期B | 價格 |
|---|---|---|---|---|---|---|
| 一個 | 阿齊茲 | 1 | 12 | 2012-01-11 00:00:00.000 | 2012-01-11 00:00:00.000 | 129.00 |
| 乙 | 阿齊茲 | 1 | 34 | 2012-01-11 00:00:00.000 | 2012-01-11 00:00:00.000 | 100.00 |
| C | 阿齊茲 | 0 | 20 | 2012-01-11 00:00:00.000 | 2012-01-11 00:00:00.000 | 349.00 |
| D | 阿齊茲 | 1 | 90 | 2012-01-11 00:00:00.000 | 2012-01-11 00:00:00.000 | 222.00 |
我想要的結果:
| 姓名 | 數 x A | 年齡 x A | 日期A x A | 日期 B x A | 價格 x A | 數字 x B | 年齡 x B | 日期A x B | 日期 B x B | 價格 x B |
|---|---|---|---|---|---|---|---|---|---|---|
| 阿齊茲 | 1 | 12 | 2012-01-11 | 2012-01-11 | 129.00 | 1 | 34 | 2012-01-11 | 2012-01-11 | 100.00 |
C和D都在一條線上
uj5u.com熱心網友回復:
您可以像這樣長期執行此操作:
SELECT name,
[num x A] = MAX(CASE type WHEN 'A' THEN num END),
[age x A] = MAX(CASE type WHEN 'A' THEN age END),
[dateA x A] = MAX(CASE type WHEN 'A' THEN dateA END),
[DateB x A] = MAX(CASE type WHEN 'A' THEN DateB END),
[PRICE x A] = MAX(CASE type WHEN 'A' THEN PRICE END),
[num x B] = MAX(CASE type WHEN 'B' THEN num END),
[age x B] = MAX(CASE type WHEN 'B' THEN age END),
[dateA x B] = MAX(CASE type WHEN 'B' THEN dateA END),
[DateB x B] = MAX(CASE type WHEN 'B' THEN DateB END),
[PRICE x B] = MAX(CASE type WHEN 'B' THEN PRICE END),
[num x C] = MAX(CASE type WHEN 'C' THEN num END),
[age x C] = MAX(CASE type WHEN 'C' THEN age END),
[dateA x C] = MAX(CASE type WHEN 'C' THEN dateA END),
[DateB x C] = MAX(CASE type WHEN 'C' THEN DateB END),
[PRICE x C] = MAX(CASE type WHEN 'C' THEN PRICE END),
[num x D] = MAX(CASE type WHEN 'D' THEN num END),
[age x D] = MAX(CASE type WHEN 'D' THEN age END),
[dateA x D] = MAX(CASE type WHEN 'D' THEN dateA END),
[DateB x D] = MAX(CASE type WHEN 'D' THEN DateB END),
[PRICE x D] = MAX(CASE type WHEN 'D' THEN PRICE END)
FROM dbo.YourTableName GROUP BY name;
這個小提琴中的作業示例。
您也可以動態執行此操作,如果稍后添加更多型別或架構更改,這將有所幫助:
DECLARE @sql nvarchar(max),
@types varchar(32) = 'A,B,C,D',
@cols nvarchar(max) = N'num,age,dateA,DateB,PRICE';
SELECT @sql = STRING_AGG(o, ',' char(13) char(10)) FROM
(
SELECT QUOTENAME(CONCAT(c.value, ' x ', t.value))
CONCAT(' = MAX(CASE type WHEN ',
QUOTENAME(t.value, char(39)), N' THEN ', c.value, N' END)')
FROM STRING_SPLIT(@types, ',') AS t
CROSS APPLY STRING_SPLIT(@cols, ',') AS c
) AS x(o);
SET @sql = N'SELECT name,
' @sql N' FROM dbo.YourTableName GROUP BY name;';
EXECUTE sys.sp_executesql @sql;
這在這個小提琴中得到了證明。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/528854.html
