当查询特定的表时,我需要更改结果的结构,使得给定年份的所有值都在同一行上,在标识值所属类别的单独列中。
表格如下(示例数据):
year | category | amount
1991 | A of s | 56
1992 | A of s | 55
1993 | A of s | 40
1994 | A of s | 51
1995 | A of s | 45
1991 | Total | 89
1992 | Total | 80
1993 | Total | 80
1994 | Total | 81
1995 | Total | 82
我需要的结果是:
year | a_of_s | total
1991 | 56 | 89
1992 | 55 | 80
1993 | 40 | 80
1994 | 51 | 81
1995 | 45 | 82
据我所知,我需要使用 pivot 。但是,我的问题似乎是我不理解枢轴。我试图在类似的问题中调整解决方案的查询,其中枢轴似乎是答案的一部分,到目前为止,我想出的是:
SELECT year, [A of s], [Total] FROM table
pivot (
max(amount)
FOR category in ([A of s], [Total])
) pvt
ORDER BY year
这将返回正确的表结构,但列a_of_s和total中的所有单元格都为NULL,并且每年都会列出两次。我想要得到的结果是什么?
编辑:在修复评论中指出的错误之后,剩下的唯一真正问题是年份列中的年份列出两次。
可能相关:我在pivot(max,sum,min等)中使用的聚合函数是否是任意的?
答案 0 :(得分:0)
我认为你真的不需要转动你的桌子,你需要的结果可以创造一种替代方法来实现它。
这是我根据您的要求返回的查询。
;With cte as
(
select year, Amount from tbl
where category = 'A of s'
)
select
tbl1.year, tbl2.Amount as A_of_S, tbl1.Amount as Total
from tbl as tbl1
inner join cte as tbl2 on tbl1.year = tbl2.year
where tbl1.category = 'Total'
这是我在你的考试日为你创建的SQL小提琴。 - > SQL fiddle
答案 1 :(得分:0)
更简单的回答:
WITH VTE AS(
SELECT *
FROM (VALUES (1991,'A of s',56),
(1992,'A of s',55),
(1993,'A of s',40),
(1994,'A of s',51),
(1995,'A of s',45),
(1991,'Total',89),
(1992,'Total',80),
(1993,'Total',80),
(1994,'Total',81),
(1995,'Total',82)) V([year],category, amount))
SELECT [year],
MAX(CASE category WHEN 'A of s' THEN amount END) AS [A of s],
MAX(CASE category WHEN 'Total' THEN amount END) AS Total
FROM VTE
GROUP BY [year];