如何在T-SQL GROUP BY中使用另一个GROUP BY?

问题描述 投票:0回答:1

SQL_GroupByQry

我有以下T-SQL查询。

SELECT
CASE
    WHEN ap.Brand = 'T' THEN 'Toyota'
    WHEN ap.BRAND = 'L' THEN 'Lexus'
    ELSE 'Both'
END AS Brand, av.Name, YEAR(ap.Last_update_date) AS YEAR, MONTH(ap.Last_update_date) AS MONTH, COUNT(an.Id) AS COUNT FROM AimNotifications an
INNER JOIN AIM_PUBS ap ON ap.GUID = an.Publication_Id
INNER JOIN AIM_PUB_X_VEHICLE apv ON apv.AIM_PUB_ID = ap.GUID
INNER JOIN AIM_VEHICLES av on apv.VEHICLE_ID = av.Id
WHERE DATEPART(MONTH, ap.Last_update_date) = 4
GROUP BY av.Name, an.Id, YEAR(ap.Last_update_date), MONTH(ap.Last_update_date), ap.Brand
ORDER BY 3 DESC, 4 DESC, 2 ASC, 1 DESC

这给了我如附图所示的结果.但我仍然需要为相同的记录做另一个GROUP BY(例如:像前7条记录)。

sql tsql group-by
1个回答
0
投票

我怀疑你想。

SELECT (CASE WHEN MAX(op.Brand) = MIN(ap.Brand) THEN MAX(ap.Brand) ELSE 'Both' END) as brand,
       av.Name, YEAR(ap.Last_update_date) AS YEAR, MONTH(ap.Last_update_date) AS MONTH, 
      COUNT(an.Id) AS COUNT
FROM AimNotifications an JOIN
     AIM_PUBS ap
     ON ap.GUID = an.Publication_Id JOIN
     AIM_PUB_X_VEHICLE apv
     ON apv.AIM_PUB_ID = ap.GUID JOIN
     AIM_VEHICLES av 
     ON apv.VEHICLE_ID = av.Id
WHERE DATEPART(MONTH, ap.Last_update_date) = 4 AND
      AP.Brand IN ('L', 'T')
GROUP BY av.Name, YEAR(ap.Last_update_date), MONTH(ap.Last_update_date)
ORDER BY 3 DESC, 4 DESC, 2 ASC, 1 DESC;

这直接解决了你的查询问题,而不需要另一个层次的聚合。

注意事项。

  • 过滤月而不过滤年是可疑的,但我没有改变。
  • 移除 Brand 来自 GROUP BY.
  • 移除 id 来自 GROUP BY.
  • 增加了以下逻辑 Brand 所以你可以得到 "两者"。
  • 只在以下情况下进行过滤 'L''T' -- 如果您的数据中只有这些品牌,可能就没有必要了。
© www.soinside.com 2019 - 2024. All rights reserved.