输入
水果 | 季节 | 价格 | |
---|---|---|---|
苹果 | 弹簧 | 15 | |
苹果 | 夏季 | 20 | |
苹果 | 秋季 | 35 | |
苹果 | 冬季 | 55 | |
香蕉 | 弹簧 | 13 | |
香蕉 | 夏季 | 2 | |
香蕉 | 秋季 | 3 | |
香蕉 | 冬季 | 5 | |
桃 | 春40 | ||
桃 | 夏季50 | ||
桃 | 秋 | 33 | |
桃 | 冬季44 |
这是使用条件聚合实现这一点的基本方法,无需进行透视:
select fruit, SUM(CASE WHEN season = 'spring' then price else 0 END) SpringPrice,
SUM(CASE WHEN season = 'autumn' then price else 0 END) AutumnPrice,
SUM(CASE WHEN season = 'winter' then price else 0 END) WinterPrice,
SUM(CASE WHEN season = 'summer' then price else 0 END) SummerPrice
from Question
group by fruit
即使你不知道任何水果的名字,也很容易为每个水果排一排:
SELECT * FROM dbo.Question
PIVOT (MAX(price) FOR season IN
([spring],[summer],[autumn],[winter])
) AS p;
如果你事先不了解他们,就很难获得本季的专栏(见这里的一些想法(。
按如下使用pivot
SELECT *
FROM (
SELECT
fruit
, CONCAT(season, '_price') AS Col
, price
FROM Question
) Src
PIVOT (
MAX(price)
FOR Col IN (
[spring_price], [summer_price],
[autumn_price], [winter_price]
)
) Pvt
ORDER BY fruit;
SQL语言有一个非常严格的要求,要求您在查询编译时了解结果中的列,然后再查看任何数据如果你必须查看数据才能找到你想要的列,那么你就只能使用(潜在危险的(动态SQL,需要三个步骤:
- 运行查询以查找有关所需列的信息
- 使用步骤1中的结果动态构建一个新的SQL语句
- 从步骤2运行SQL
在这种情况下,我们看到spring
、summer
、autumn
和winter
,它们是可以避免此问题的固定值。但我们也看到了这一点:
不能在sql查询中使用spring、summer等。
这是个问题。它使您回到了动态SQL领域,因为在查询完成编译之前,您将再次查看数据。