动态 SQL 透视查询中的分组和聚合函数

Posted

技术标签:

【中文标题】动态 SQL 透视查询中的分组和聚合函数【英文标题】:Group by and aggregate functions in dynamic SQL Pivot Query 【发布时间】:2013-10-23 00:38:16 【问题描述】:

我制定了以下动态 SQL 查询来将未知数量的行值(Maschine Names as nvarchar)转换为列。透视列的行值应该是特定机器的停机时间和维护时间(均为整数)的总和。

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += N', p.' + QUOTENAME(Maschines)
  FROM (SELECT Maschines FROM Rawdata AS p
  GROUP BY MASCHINE) AS x;
SET @sql = N'
SELECT ' + STUFF(@columns, 1, 2, '') + '
FROM(

  SELECT * from Rawdata
   ) AS j
PIVOT
(
  SUM(maintenance) FOR Maschines IN ('
  + STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')
  +')
) AS p;';
EXEC sp_executesql @sql;

查询返回汇总的维护时间,但是一旦我尝试在总和中包含多个列(例如 Sum(maintenance+downtime) ),我会收到接近“+”的错误。

此外,查询返回一个透视表,但仍然具有相同的行数,但是我需要一个针对未知列数分组的结果,因此只包含一行

【问题讨论】:

【参考方案1】:

不幸的是,SQL 中的 PIVOT 相当有限,因为您只能执行单个列的单个聚合。

你最好的选择不仅仅是做

Select * from rawdata

作为您的来源,包括一个预先添加维护和停机时间的列,例如

select *, maintenance + downtime as TotalTime from rawdata

然后聚合它。

【讨论】:

以上是关于动态 SQL 透视查询中的分组和聚合函数的主要内容,如果未能解决你的问题,请参考以下文章

查询分组中的 Oracle SQL 条件聚合函数

为啥sql查询语句中的count(*)等聚合函数可以放在having后面,而不能放在where后面?

MySQL分组、排序

在数据透视聚合函数中使用CONCAT函数的SQL Server错误

高级SQL查询-(聚合查询,分组查询,联合查询)

数据的分组与计算