SQL Server:在select中组合多个计数的更好/更快的方法

时间:2014-04-03 16:41:52

标签: sql sql-server union union-all multiple-select

我正在使用以下存储过程来组合多个计数。 到目前为止,此工作正常并返回以下XML,即过去6个月中每个记录的记录数。

由于我对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 个答案:

答案 0 :(得分: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