【发布时间】:2015-11-11 17:03:39
【问题描述】:
我正在尝试设置一个查询,该查询从表中选择多行并将相似的行组合成具有多列的单行。我相信我可以使用枢轴来做到这一点,但是每一行的列数不会相同,这就是我遇到问题的地方。我在下面举了一个例子来说明我的意思。
这个:
Account Period Amount
01 0001 1111
01 0002 2222
01 0003 3333
02 0001 1111
03 0001 1111
04 0001 1111
04 0002 2222
应该是这样的:
Account 0001 0002 0003
01 1111 2222 3333
02 1111
03 1111
04 1111 2222
这是我的初始查询,它将所有数据放在一起:
WITH CTE AS(
SELECT
a.Period, a.Account, SUM(a.Amount) Amount
FROM
LedgerAP a
WHERE
a.Period >= 201500
GROUP BY a.Period, a.Account
UNION
SELECT
b.Period, b.Account, SUM(b.Amount) Amount
FROM
LedgerAR b
WHERE
b.Period >= 201500
GROUP BY b.Period, b.Account
UNION
SELECT
c.Period, c.Account, SUM(c.Amount)
FROM
LedgerEx c
WHERE
c.Period >= 201500
GROUP BY c.Period, c.Account
UNION
SELECT
d.Period, d.Account, SUM(d.Amount)
FROM
LedgerMisc d
WHERE
d.Period >= 201500
GROUP BY d.Period, d.Account
)
SELECT account,
max(case when period = @Budgetyear + '01' then SUM(amount) end) Amount1,
max(case when period = @Budgetyear + '02' then SUM(amount) end) Amount2,
max(case when period = @Budgetyear + '03' then SUM(amount) end) Amount3,
max(case when period = @Budgetyear + '04' then SUM(amount) end) Amount4,
max(case when period = @Budgetyear + '05' then SUM(amount) end) Amount5,
max(case when period = @Budgetyear + '06' then SUM(amount) end) Amount6,
max(case when period = @Budgetyear + '07' then SUM(amount) end) Amount7,
max(case when period = @Budgetyear + '08' then SUM(amount) end) Amount8,
max(case when period = @Budgetyear + '09' then SUM(amount) end) Amount9,
max(case when period = @Budgetyear + '10' then SUM(amount) end) Amount10,
max(case when period = @Budgetyear + '11' then SUM(amount) end) Amount11,
max(case when period = @Budgetyear + '12' then SUM(amount) end) Amount12
FROM CTE
GROUP BY account
ORDER BY account ASC
现在我该如何像上面展示的那样组织这个?任何帮助都会很棒!
【问题讨论】:
-
动态 PIVOT,附加列将有
NULL -
我编辑了帖子以显示我正在尝试的当前方式,但我在聚合中有一个聚合,所以它不喜欢它
标签: sql sql-server pivot