2014-04-03 20 views
0

我正在使用下面的存儲過程來合併多個計數。 到目前爲止,這工作正常,並返回以下XML,即過去6個月中每個記錄的計數。SQL Server:選擇合併多個計數的更好/更快的方式

因爲我對SQL很新,而且所有這些計數都在同一個表上完成,所以我想知道是否有更好/更快的方法來實現這一點。

結果示例(XML):

<ranks> 
    <groupCount>18</groupCount> 
    <groupCount>15</groupCount> 
    <groupCount>21</groupCount> 
    <groupCount>13</groupCount> 
    <groupCount>15</groupCount> 
    <groupCount>19</groupCount> 
</ranks> 

我的存儲過程:

BEGIN 
    SET NOCOUNT ON; 
    SELECT  COUNT(*) AS groupCount 
    FROM  Log_PE 
    WHERE  CONVERT(DATE, dateEsc, 120) >= CONVERT(DATE, CONVERT(VARCHAR(6), GETDATE(), 112) + '01', 112) 
     UNION ALL 
    SELECT  COUNT(*) AS groupCount 
    FROM  Log_PE 
    WHERE  CONVERT(DATE, dateEsc, 120) >= CONVERT(DATE, CONVERT(VARCHAR(6), DATEADD(month, -1, GETDATE()), 112) + '01', 112) 
     UNION ALL 
    SELECT  COUNT(*) AS groupCount 
    FROM  Log_PE 
    WHERE  CONVERT(DATE, dateEsc, 120) >= CONVERT(DATE, CONVERT(VARCHAR(6), DATEADD(month, -2, GETDATE()), 112) + '01', 112) 
     UNION ALL 
    SELECT  COUNT(*) AS groupCount 
    FROM  Log_PE 
    WHERE  CONVERT(DATE, dateEsc, 120) >= CONVERT(DATE, CONVERT(VARCHAR(6), DATEADD(month, -3, GETDATE()), 112) + '01', 112) 
     UNION ALL 
    SELECT  COUNT(*) AS groupCount 
    FROM  Log_PE 
    WHERE  CONVERT(DATE, dateEsc, 120) >= CONVERT(DATE, CONVERT(VARCHAR(6), DATEADD(month, -4, GETDATE()), 112) + '01', 112) 
     UNION ALL 
    SELECT  COUNT(*) AS groupCount 
    FROM  Log_PE 
    WHERE  CONVERT(DATE, dateEsc, 120) >= CONVERT(DATE, CONVERT(VARCHAR(6), DATEADD(month, -5, GETDATE()), 112) + '01', 112) 

    FOR XML PATH(''), ROOT('ranks') 
END 

與此的任何幫助,蒂姆非常感謝。

回答

1

你的要求似乎與你在你的SQL在做什麼

select CONVERT(DATE, CONVERT(VARCHAR(6), GETDATE(), 112) + '01', 112) 

將獲得當月

select CONVERT(DATE, CONVERT(VARCHAR(6), GETDATE(), 112) + '02', 112) 

的第一天將獲得當月

的第二天發生衝突

要獲得按月分組的記錄的最後6個月的計數

SELECT  COUNT(*) AS groupCount 
    FROM  Log_PE 
    WHERE  dateEsc >= CAST(DATEADD(day, 1, DATEADD(month, -6, DATEADD(day, day(GETDATE())*-1, GETDATE()))) as DATE) --the first day of the month, 6 months ago 
     AND dateEsc < DATEADD(day, (day(GETDATE())*-1)+1, GETDATE()) -- the first day of current month 
    GROUP BY year(dateEsc), month(dateEsc) 
    ORDER BY year(dateEsc), month(dateEsc) 
    FOR XML PATH(''), ROOT('ranks') 

這是一個SQL小提琴:http://www.sqlfiddle.com/#!3/3ff71/7

+0

感謝您的支持! – user2571510

相關問題