SQL Server:在“全部并入选择”中合并自行

问题描述 投票:0回答:2

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

是否有更快/更好的方式编写此代码,这样我就不必向每个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>
sql sql-server select union union-all
2个回答
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
投票

我认为其他发布的查询在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')
© www.soinside.com 2019 - 2024. All rights reserved.