sql中的PIVOT如何知道列不同?

use*_*929 1 sql pivot pivot-table

就拿这个例子: http://blogs.msdn.com/b/spike/archive/2009/03/03/pivot-tables-in-sql-server-a-simple-sample.aspx

  • 如何查询查询每个供应商的平均值?该查询不包含对VendorId列的任何引用,因此我无法知道如何收集每个供应商的IncomeAmounts.
  • 它如何选择执行PIVOT函数的行组?

Dee*_*kha 5

数据透视请求基本上涉及三个逻辑处理阶段,每个阶段都包含相关元素:

  1. 分组阶段
  2. 传播阶段
  3. 以及具有关联聚合元素和聚合函数的聚合阶段.

这里重要的是你用PIVOT算子do not explicitly specify the grouping elements,removing the need for GROUP BY in the query.PIVOT运算符图中出来的分组元素隐含地从那些没有指定为源表(或表表达式)的所有属性的任一spreading element或aggregation element.因此,您必须确保PIVOT运算符的源表除了分组,传播和聚合元素之外没有任何属性,因此在指定传播和聚合元素之后,剩下的唯一属性是您打算作为分组元素的属性.作为最好的做法是通过不直接将PIVOT运算符应用于原始表,而是应用于仅包含表示旋转元素和的属性的表表达式来实现此目的no others.

因此,在给定的情况下将这些阶段映射到需求

  1. 传播具有基于要做'IncomeDay'与最终列名列值:[问] [TUE],[WED],[周四],[周五],[SAT],[SUN].
  2. 'IncomeAmount' 值将被聚合以产生用于分组和扩展元素的交叉值
  3. 由于该表只有3列'VendorId'符合要进行分组的列.

将这些值放在标准的Pivot语句中:

SELECT ...
FROM <source_table_or_table_expression>
PIVOT(<agg_func>(<aggregation_element>)
FOR <spreading_element>
IN (<list_of_target_columns>)) AS <result_table_alias>
Run Code Online (Sandbox Code Playgroud)

查询变为:

select * from DailyIncome
pivot (avg (IncomeAmount) 
for IncomeDay 
in ([MON],[TUE],[WED],[THU],[FRI],[SAT],[SUN])) as AvgIncomePerDay
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!!