SQL:在pivot之后列出的列中的值

时间:2017-12-15 11:56:42

标签: sql sql-server pivot

当查询特定的表时,我需要更改结果的结构,使得给定年份的所有值都在同一行上,在标识值所属类别的单独列中。

表格如下(示例数据):

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等)中使用的聚合函数是否是任意的?

2 个答案:

答案 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];