如何在mssql中使用变量字符串将多行合并为多列名称



输入

春夏季冬季
水果 季节 价格
苹果 弹簧 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. 运行查询以查找有关所需列的信息
  2. 使用步骤1中的结果动态构建一个新的SQL语句
  3. 从步骤2运行SQL

在这种情况下,我们看到springsummerautumnwinter,它们是可以避免此问题的固定值。但我们也看到了这一点:

不能在sql查询中使用spring、summer等。

这是个问题。它使您回到了动态SQL领域,因为在查询完成编译之前,您将再次查看数据。

最新更新