SQL:优化查询/减小查询的大小

SQL:优化查询/减小查询的大小,sql,sql-server,Sql,Sql Server,上面的查询看起来并不漂亮。基本上,如果您注意到子查询和主查询中的WHERE条件是相似的。是否有一种方法可以将它们组合起来以减少此查询的大小。还有没有其他地方我可以尝试减少这个查询的大小? 寻找建议。您可以使用求和。。。在总和上的OVER(),以计算总计 SELECT p.Distributor, SUM(r.SalesVolume)

上面的查询看起来并不漂亮。基本上,如果您注意到子查询和主查询中的
WHERE
条件是相似的。是否有一种方法可以将它们组合起来以减少此查询的大小。还有没有其他地方我可以尝试减少这个查询的大小?
寻找建议。

您可以使用
求和。。。在<代码>总和上的OVER()
,以计算总计

SELECT p.Distributor,
       SUM(r.SalesVolume)                                                                                                          AS Sales,
       CAST(( ( CAST(SUM(r.SalesVolume) AS DECIMAL(14, 4)) / (SELECT SUM(r.SalesVolume)
                                                              FROM   RawData r
                                                                     INNER JOIN Product p
                                                                             ON r.ProductId = p.ProductId
                                                              WHERE  p.Distributor IN( 'TF1', 'WARNER', 'GAUMONT', 'PATHE',
                                                                                       'STUDIOCANAL', 'M6SND', 'FRANCETV' )
                                                                     AND p.VODEST IN ( 'EST' )
                                                                     AND p.ContentFlavor IN ( 'HD' )) ) * 100 ) AS DECIMAL(20, 2)) AS MarketSharesVolume
FROM   RawData r
       INNER JOIN Product p
               ON r.ProductId = p.ProductId
WHERE  p.Distributor IN ( 'TF1', 'WARNER', 'GAUMONT', 'PATHE',
                          'STUDIOCANAL', 'M6SND', 'FRANCETV' )
       AND p.VODEST IN ( 'EST' )
       AND p.ContentFlavor IN ( 'HD' )
GROUP  BY p.Distributor; 

非常好,谢谢。但是我想知道这个函数是如何工作的?如果可能的话,也许你可以简单地解释一下。@MartinSmith。
cast()
s是非常无用的,因为SQL Server在比率的比例和精度方面遵循自己的规则。@GordonLinoff-刚从OP中复制。@TauseefHussain-
SELECT p.Distributor,
       SUM(r.SalesVolume)                                                                          AS Sales,
       CAST(( ( CAST(SUM(r.SalesVolume) AS DECIMAL(14, 4)) / SUM(SUM(r.SalesVolume))
                                                               OVER() ) * 100 ) AS DECIMAL(20, 2)) AS MarketSharesVolume
FROM   RawData r
       INNER JOIN Product p
               ON r.ProductId = p.ProductId
WHERE  p.Distributor IN ( 'TF1', 'WARNER', 'GAUMONT', 'PATHE',
                          'STUDIOCANAL', 'M6SND', 'FRANCETV' )
       AND p.VODEST IN ( 'EST' )
       AND p.ContentFlavor IN ( 'HD' )
GROUP  BY p.Distributor;