SQL Server:在Union All Selects中组合From行

时间:2014-04-04 07:33:43

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

我有以下存储过程,到目前为止工作正常。

是否有更快/更好的方法来写这个,这样我就不必为每个Select添加相同的From行?

我的存储过程:

ALTER PROCEDURE [dbo].[CountEsc]
    @date0 nvarchar(20),
    @date1 nvarchar(20),
    @date2 nvarchar(20),
    @date3 nvarchar(20),
    @date4 nvarchar(20),
    @date5 nvarchar(20)
AS
BEGIN
    SET NOCOUNT ON;
    SELECT      COUNT(*) AS groupCount
    FROM        Log_Esc
    WHERE       dateEsc LIKE @date0+'%'
        UNION ALL
    SELECT      COUNT(*) AS groupCount
    FROM        Log_Esc
    WHERE       dateEsc LIKE @date1+'%'
        UNION ALL
    SELECT      COUNT(*) AS groupCount
    FROM        Log_Esc
    WHERE       dateEsc LIKE @date2+'%'
        UNION ALL
    SELECT      COUNT(*) AS groupCount
    FROM        Log_Esc
    WHERE       dateEsc LIKE @date3+'%'
        UNION ALL
    SELECT      COUNT(*) AS groupCount
    FROM        Log_Esc
    WHERE       dateEsc LIKE @date4+'%'
        UNION ALL
    SELECT      COUNT(*) AS groupCount
    FROM        Log_Esc
    WHERE       dateEsc LIKE @date5+'%'

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

我生成的XML:

<ranks>
  <groupCount>0</groupCount>
  <groupCount>5</groupCount>
  <groupCount>3</groupCount>
  <groupCount>6</groupCount>
  <groupCount>1</groupCount>
  <groupCount>0</groupCount>
</ranks>

非常感谢你提供任何帮助,蒂姆。

2 个答案:

答案 0 :(得分:1)

看起来你想要dateEsc记录的数量,但需要特定的日期列表。

我的第一个问题是:你有没有理由使用LIKE匹配?

下面的SQL可能会给你预期的结果:

SET NOCOUNT ON;

 SELECT COUNT(*) AS groupCount
   FROM Log_Esc
  WHERE dateEsc LIKE @date0+'%'
     OR dateEsc LIKE @date1+'%'
     OR dateEsc LIKE @date2+'%'
     OR dateEsc LIKE @date3+'%'
     OR dateEsc LIKE @date4+'%'
     OR dateEsc LIKE @date5+'%'
  GROUP BY dateEsc

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

答案 1 :(得分:1)

我认为其他发布的查询在count为零时不会显示值。

这是我的努力 -

 Create Table #temp  
    (
    date Datetime NULL
    )
    Insert into #temp values (CONVERT(VARCHAR(10),@date0,110))
    Insert into #temp values (CONVERT(VARCHAR(10),@date1,110))
    Insert into #temp values (CONVERT(VARCHAR(10),@date2,110))
    Insert into #temp values (CONVERT(VARCHAR(10),@date3,110))
    Insert into #temp values (CONVERT(VARCHAR(10),@date4,110))
    Insert into #temp values (CONVERT(VARCHAR(10),@date5,110))


        SELECT     
        sum(Case when dateEsc is null then 0 else 1 end) AS groupCount
        FROM      #temp t1 left join dateEsc t2 on t1.date = CONVERT(VARCHAR(10),dateEsc,110)
        group by date
        FOR XML PATH(''), ROOT('ranks')