繁体   English   中英

聚合SQL SELECT语句中的重复案例

[英]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 ENDCASE 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM