【问题标题】:Pick Date Range, Count multiple Records in range based off condition, group by shift选择日期范围,根据关闭条件计算范围内的多条记录,按班次分组
【发布时间】:2014-02-06 17:15:07
【问题描述】:

所以我是 SQL World 的新手,所以请原谅这个问题可能是多么无知。我最终可能需要为此执行一个存储过程,但在进入下一步之前尝试让它在查询中工作。

我正在尝试执行以下操作:

  1. 选择特定日期之间的记录

  2. 计算 where 语句中给定条件的记录。我有 6 条不同的记录要计数,每次计数都需要一个新列。

  3. 然后我想按 A 或 B 分组

我可以像下面这样计算记录。

     SELECT        (SELECT        COUNT(*) AS 6F
                      FROM            dbo.1_Data
                      WHERE        ([B] BETWEEN 1 AND 9) AND (Time BETWEEN CONVERT(DATETIME, '2014-01-01 00:00:00', 102) AND CONVERT(DATETIME, 
                                                '2014-02-01 00:00:00', 102))) AS 6F,
                         (SELECT        COUNT(*) AS 5E
                           FROM            dbo.1_Data AS 1_Data_1
                           WHERE        ([B] = 10) AND (Time BETWEEN CONVERT(DATETIME, '2014-01-01 00:00:00', 102) AND CONVERT(DATETIME, '2014-02-01 00:00:00',
                                                      102))) AS 5E,
                         (SELECT        COUNT(*) AS 4D
                           FROM            dbo.1_Data AS 1_Data_2
                           WHERE        ([B] BETWEEN 11 AND 13) AND (Time BETWEEN CONVERT(DATETIME, '2014-01-01 00:00:00', 102) AND CONVERT(DATETIME, 
                                                     '2014-02-01 00:00:00', 102))) AS 4D,
                         (SELECT        COUNT(*) AS 1A
                           FROM            dbo.1_Data AS 1_Data_3
                           WHERE        ([B] = 14) AND (Time BETWEEN CONVERT(DATETIME, '2014-01-01 00:00:00', 102) AND CONVERT(DATETIME, '2014-02-01 00:00:00',
                                                      102))) AS 1A,
                         (SELECT        COUNT(*) AS 2B
                           FROM            dbo.1_Data AS 1_Data_4
                           WHERE        ([A Step] BETWEEN 1 AND 25) AND (Time BETWEEN CONVERT(DATETIME, '2014-01-01 00:00:00', 102) AND CONVERT(DATETIME, 
                                                     '2014-02-01 00:00:00', 102))) AS 2B,
                         (SELECT        COUNT(*) AS 3C
                           FROM            dbo.1_Data AS 1_Data_5
                           WHERE        ([B Step] = 0) AND ([ A Step] = 0) AND (Time BETWEEN CONVERT(DATETIME, '2014-01-01 00:00:00', 102) AND 
                                                     CONVERT(DATETIME, '2014-02-01 00:00:00', 102))) AS 3C

我可以这样做以获取时间范围内给定步骤中的记录数并进行分组。

    SELECT COUNT([B]) AS [1A], Letter

    FROM  dbo.1_Data

    WHERE (Time BETWEEN CONVERT(DATETIME, '2014-01-05 00:00:00', 102) AND CONVERT(DATETIME, '2014-01-10 00:00:00', 102)) AND ([B] = 14)

    GROUP BY Letter

我正在寻找与此类似的最终结果。列名在顶部,记录数在其下方。

1A 的列,A 的记录计数和 B 的计数。

|1A |信 |


|34 |一个 |


|93 |乙|

如何将所有这些合并到一个查询语句中,以便在给定的日期范围和条件内整理出数据,然后按字母分组?

【问题讨论】:

    标签: sql count subquery


    【解决方案1】:

    我仍然对你想要什么感到困惑,但我认为你需要这个

    SELECT COUNT(CASE WHEN ( [B] BETWEEN 1 AND 9 )
                           AND ( [Time] BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00' ) THEN 1
                      ELSE NULL
                 END) AS '6f'
           ,COUNT(CASE WHEN ( [B] = 10 )
                            AND ( [Time] BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00' ) THEN 1
                       ELSE NULL
                  END) AS '5E'
           ,COUNT(CASE WHEN ( [B] BETWEEN 11 AND 13 )
                            AND ( [Time] BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00' ) THEN 1
                       ELSE NULL
                  END) AS '4D'
           ,COUNT(CASE WHEN ( [B] = 14 )
                            AND ( [Time] BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00' ) THEN 1
                       ELSE NULL
                  END) AS '1A'
           ,COUNT(CASE WHEN ( [A Step] BETWEEN 1 AND 25 )
                            AND ( [Time] BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00' ) THEN 1
                       ELSE NULL
                  END) AS '2B'
           ,COUNT(CASE WHEN [B Step] = 0
                            AND [ A Step] = 0
                            AND ( [Time] BETWEEN '2014-01-01 00:00:00' AND '2014-02-01 00:00:00' ) THEN 1
                       ELSE NULL
                  END) AS '3C'
        FROM dbo.[1_Data]
    
    • 您不需要将 '2014-01-01' 转换为 DATETIME SQL Server 会自动执行此操作
    • 您可以在CASE 语句和CASE 语句的COUNT 结果中放置逻辑,计数时请记住NULL 您的else 结果,否则它将计算所有内容。

    【讨论】:

    • 那行得通。我希望有一种方法只需要更改一次 StartDate 和 EndDate 。但是我可以使用存储过程中的参数来解决这个问题。感谢您的帮助。我已将您的回复标记为已回答。
    • 没关系。我的错。这将与那里的正确 where 语句完美配合。再次感谢您帮助解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    相关资源
    最近更新 更多