【发布时间】:2017-06-06 15:17:31
【问题描述】:
我的数据如下所示:
| ACCNT | AMOUNT | TYPE | YEAR |
|-------|--------|------|------|
| 458 | 168.80 | A | 2014 |
| 458 | 282.77 | A | 2015 |
| 458 | 64.70 | B | 2015 |
| 458 | 91.25 | A | 2016 |
| 458 | 398.00 | B | 2016 |
| 458 | 104.45 | C | 2016 |
| 927 | 445.00 | B | 2014 |
| 927 | 25.00 | A | 2015 |
| 927 | 10.00 | NULL | 2015 |
| 927 | 132.00 | A | 2016 |
| 927 | 381.40 | B | 2016 |
| 927 | 210.00 | C | 2016 |
...
Accnt 可能没有每个 Year 的值,并且 Type 偶尔会为 NULL。 我希望每个账户只有一行,并结合年份标题下的金额和类型列,即让它看起来像这样:
| ACCNT | 2014 | 2015 | 2016 |
|-------|-----------|--------------------|----------------------------|
| 458 | 168.80,A | 282.77,A;64.70,B | 91.25,A;398.00,B;104.45,C |
| 927 | 445.00,B | 25.00,A;10.00,NULL | 132.00,A;381.40,B;210.00,C |
...
我可以在 [年] 上旋转...
SELECT * FROM
(SELECT [Accnt], [Amount], [Type], [Year] FROM data_table)
AS Source
PIVOT
(
MAX([Amount]) FOR [Year] IN ([2014],[2015],[2016])
) AS PVT
...但每个帐户仍然有多个行。
以下更接近我正在寻找的格式...
SELECT Accnt, [1] AS '2014', [2] AS '2015', [3] AS '2016'
FROM (SELECT ROW_NUMBER() OVER (PARTITION BY Accnt ORDER BY [Year] Asc) AS AccountID,
Accnt, CONVERT(nvarchar,Amount) + ',' + [Type] AS Amount_And_Type
FROM data_table) PIVOT (MAX(Amount_And_Type)
FOR AccountID IN ([1], [2], [3])) AS data_pvt
...但它只是给了我每个 Accnt 的前三行:
| ACCNT | 2014 | 2015 | 2016 |
|-------|-----------|----------|---------|
| 458 | 168.80,A | 282.77,A | 67.40,B |
| 927 | 445.00,B | 25.00,A | NULL |
我正在尝试使用 Pivot 来实现吗?
【问题讨论】:
-
理想情况下,数据的表示将在表示层处理;不在数据层。那就是说为什么数据库有一个支点呢?
-
看看
stuff和for xml用于将数据行转换为单个字段的函数。
标签: sql-server sql-server-2008-r2 pivot row-number