【问题标题】:SQL Server: combine From lines in Union All SelectsSQL Server:在 Union All Selects 中组合 From 行
【发布时间】:2014-05-16 09:21:13
【问题描述】:

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

有没有更快/更好的方法来写这个,这样我就不必为每个 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>

【问题讨论】:

  • 日期总是一样长吗?日期总是不同的吗?
  • 是的,日期总是相同的长度(格式:yyyy-mm,例如 2014-04)并且总是不同的。
  • 你能发布样本数据和预期结果的模拟吗?

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


【解决方案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')

【讨论】:

  • 谢谢。我正在使用 LIKE,因为输入仅采用 yyyy-mm 格式,所以这样我可以获取同一个月的所有记录。
  • 这对我不起作用,因为它返回 13 而不是 6 个值,不确定它在那里算什么。
【解决方案2】:

我认为当计数为零时,其他发布的查询不会显示值。

这是我的努力-

 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')

【讨论】:

  • 谢谢。这看起来不错,不幸的是我无法使用它,因为我没有在此服务器上运行 CREATE TABLE 的权限。我可以声明一个临时表吗?
  • 在该示例中,我仅使用了#temp 表。具有最基本权限的登录具有创建和使用临时表的完全权限。
  • 也可以使用表变量---'DECLARE @Temp TABLE (date Datetime NULL)'
猜你喜欢
  • 1970-01-01
  • 2015-03-03
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 2020-06-20
  • 1970-01-01
  • 2018-07-11
相关资源
最近更新 更多