【发布时间】:2019-02-27 17:13:01
【问题描述】:
我有一个查询,它通过列的动态列表(即列可以随时更改)并透视显示这些列的最大安装日期的数据。但是,我的问题是,我如何进行多个聚合?我也需要每个 PlaceRef 的 Max LocationCode、MakeCode 和 ModelCode,但我正在努力做到这一点。非常感谢。
DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += N', p.' + QUOTENAME(Component )
FROM (SELECT p.Component FROM VwLocationComponentCurrent AS p
INNER JOIN VwLocationListEntriesCurrent AS o ON p.PlaceRef = o.PlaceRef
where o.LocationList = N'NEWBUILD'
GROUP BY p.Component) AS x;
SET @sql = N'
SELECT PlaceRef, Address1, StreetName, PostCode, Substatus, BuildingType, BuildDate, ' + STUFF(@columns , 1, 2, '') + '
FROM
(
SELECT
vwLocationCurrent.PlaceRef
,vwLocationCurrent.BuildDate
,vwLocationCurrent.SubStatus
,vwLocationCurrent.StreetName
,vwLocationCurrent.Address1
,vwLocationCurrent.Address2
,vwLocationCurrent.Address3
,vwLocationCurrent.PostCode
,VwLocationComponentCurrent.Component
,VwLocationComponentCurrent.SubLocationCode
,VwLocationComponentCurrent.InstalledDate
,VwLocationComponentCurrent.MakeCode
,VwLocationComponentCurrent.ModelCode
,VwLocationListEntriesCurrent.LocationList
,vwLocationCurrent.BuildingType
FROM
vwLocationCurrent
INNER JOIN VwLocationListEntriesCurrent
ON vwLocationCurrent.PlaceRef = VwLocationListEntriesCurrent.PlaceRef
LEFT OUTER JOIN VwLocationComponentCurrent
ON vwLocationCurrent.PlaceRef = VwLocationComponentCurrent.PlaceRef
WHERE
VwLocationListEntriesCurrent.LocationList = ''NEWBUILD''
) AS j
PIVOT
(
MAX(InstalledDate) FOR Component IN ('
+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')
+ ')
) AS p;'
;
PRINT @sql;
EXEC sp_executesql @sql;
【问题讨论】:
-
您使用的是哪个 dbms? (该查询是特定于产品的。)
-
@Deb 如果有人问您数据库是什么,请将该数据库添加为标签(我刚刚做了)。标签很重要。
-
好的,谢谢,我已经把 SQL 放在标签里了,只是没有 SQL-Server,干杯。
-
对于多重聚合,使用
MAX(CASE WHEN ... END)的方式更方便 -
不确定是否可以使用 MAX(CASE WHEN .. ),因为列名是动态创建的,并且随时都有超过 50 个
标签: sql sql-server dynamic pivot