[英]Repetitive CASE WHEN in Aggregate SQL SELECT Statements
我试图减少我经常使用的查询的成本和大小,它看起来过于重复,以致无法成为最有效的处理方式。
简化表示如下:
SELECT [Year],
[Month],
COUNT(CASE WHEN Type = 'Quotation' THEN clientID ELSE NULL END),
COUNT(CASE WHEN Type = 'Purchase' THEN ClientID ELSE NULL END),
SUM(CASE WHEN Type = 'Purchase' THEN Cost ELSE NULL END)
...
FROM dbo.Example
GROUP BY [Year],[Month]
我认为我必须能够精简其尺寸和成本,这是CASE WHEN ... THEN ELSE NULL END
的CASE WHEN ... THEN ELSE NULL END
。 有什么建议吗?
我正在使用SQL Server 2008 R2,谢谢。
如何按类型进行视图? (报价,购买等)。 这样,您可以逐视图优化视图并进行联接查询以获取所需的内容。
我认为这是“旋转”桌子的推荐方法。
从Microsoft-> https://support.microsoft.com/zh-cn/kb/175574查看本文
费用可能在“类型”列中,也许您可以为该索引建立-> 如何在sql中为字符串列创建索引?
嗯,怎么了?
SELECT [Year],
[Month],
[Type],
COUNT(ClientID) "Count",
SUM(Cost) "TotalCost",
...
FROM dbo.Example
GROUP BY [Year],[Month],[Type]
您执行此操作的方式是对其进行非规范化。 这就是为什么性能如此差的原因。 当然,当Type = 'Quotation'
时,您正在生成SUM(Cost)
,并且可能不需要,但是添加通常不是查询性能的限制因素。
是否出于某些原因,您每个[Year],[Month]
只必须有一个记录?
根据您的经验,如果您遇到的复杂的事情很多,并且有很多条件聚集,那么以逐步的方式构建它会更快,更清晰。 也就是说,拥有一个具有所需数据结构的表变量,并通过避免使用CASE语句的单个查询向其中添加记录,并(希望)基于索引列进行记录选择。
因此,如果您有一个名为@TypeTotals
的表变量,则可以执行以下操作(使用简化的示例):
INSERT INTO @TypeTotals
SELECT [Year],
[Month],
[Type],
COUNT(ClientID),
Null,
Null
FROM dbo.Example
WHERE [Type] = 'Quotation'
GROUP BY
[Year], [Month]
INSERT INTO @TypeTotals
SELECT [Year],
[Month],
[Type],
Null,
COUNT(ClientID),
SUM(Cost)
FROM dbo.Example
WHERE [Type] = 'Purchase'
GROUP BY
[Year], [Month]
... etc ...
然后,您可以总结@TypeTotals
的内容。
加快速度的关键是避免使用那些CASE语句(正如您已经知道的那样),并充分利用索引。
并进行实验。 如果可能的话,请使用Profiler,因为执行计划并不总是代表您真正将获得的速度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.