【问题标题】:How to Apply Conditional Logic to Where Statement如何将条件逻辑应用于 Where 语句
【发布时间】:2017-10-10 13:01:51
【问题描述】:

我似乎不知道如何为我的特定问题设置逻辑。我正在尝试计算“服务”一词出现的次数,但仅在 RECORD_CODE 为 INCIDENT 时才出现。当 RECORD 是 INCIDENT-UPDATE 时,它通常已经作为 INCIDENT 存在于其他地方,因此我将它们排除在外,以免重复我的数据。

但是,在少数情况下,SUBMIT_METHOD 是“WEB”并且唯一的记录是 INCIDENT_UPDATE,我无法弄清楚如何只查看 RECORD = 'INCIDENT' 的位置,除非特定记录的 SUBMIT_METHOD 为“WEB”,并且该报告 # 没有记录,记录为 INCIDENT。这可能是一个简单的问题,我只是想多了,但我想不出该怎么做。任何帮助将不胜感激!

我的查询:

        SELECT column2, count(*) as 'COUNT'
        from Service.Table
        where date between '1/1/17' and '1/31/17'
        and column1 = 'Issue'
        and RECORD = 'INCIDENT'
        group by column2

数据样本:

REPORT #    RECORD    SUBMIT_METHOD   SUBMIT_DATE   COLUMN2
1234       Incident       Web          1/1/2017     Service
1234    Incident-Update   Web          1/1/2017     Service
1235       Incident      Phone        1/15/2017      Other
1235    Incident-Update  Phone        1/15/2017      Other
1236    Incident-Update   Web         1/18/2017     Service

这种情况下的预期输出是:

COLUMN2   COUNT
Service     3

如果我可以提供任何其他信息,请告诉我!

【问题讨论】:

    标签: sql sql-server sql-server-2008 conditional


    【解决方案1】:

    您可以使用not exists 子查询来确保没有其他行具有相同的 Report# 和记录类型为 INCIDENT:

    select  *
    from    Service.Table t1
    where   date between '1/1/17' and '1/31/17' and
            column1 = 'Issue' and
            (
              record = 'Incident' or
              (
                record = 'Incident-Update' and
                submit_method = 'Web' and
                not exist 
                (
                  select  *
                  from    Service.Table t2
                  where   t2.record = 'INCIDENT' 
                          and t2.[Report #] = t1.[Report #]
                )
              )
            )
    

    【讨论】:

    • 非常感谢安多玛!这似乎是在正确的轨道上。但是,当我运行按第 2 列分组的计数(*)时,它只为具有事件更新的服务输出 1,没有其他事件,它不包括常规事件服务计数?
    • 它也应该计算常规事件,只要日期和column1条件匹配?
    【解决方案2】:
     ;With cte(REPORT#,RECORD ,SUBMIT_METHOD,SUBMIT_DATE,COLUMN2)
    AS
    (
    SELECT 1234,'Incident'        ,'Web'  , '1/1/2017' ,'Service'   Union all
    SELECT 1234,'Incident-Update' ,'Web'  , '1/1/2017' ,'Service'   Union all
    SELECT 1235,'Incident'        ,'Phone', '1/15/2017',  'Other'   Union all
    SELECT 1235,'Incident-Update' ,'Phone', '1/15/2017',  'Other'   Union all
    SELECT 1236,'Incident-Update' ,'Web'  , '1/18/2017', 'Service'
    )
    SELECT COLUMN2
        ,CountCOLUMN2
    FROM (
        SELECT *
            ,COUNT(COLUMN2) OVER (
                PARTITION BY COLUMN2 ORDER BY COLUMN2
                ) CountCOLUMN2
            ,ROW_NUMBER() OVER (
                PARTITION BY COLUMN2 ORDER BY COLUMN2
                ) Seq
        FROM cte
        ) Dt
    WHERE SUBMIT_DATE BETWEEN '1/1/17'
            AND '1/31/17'
        AND RECORD = 'INCIDENT'
    ORDER BY 1 DESC
    

    输出

    COLUMN2 CountCOLUMN2
    --------------------
    Service  3
    Other    2
    

    【讨论】:

      【解决方案3】:

      您正在寻找group by 的赞

      select column2, count(*)
      from tbl1
      where SUBMIT_METHOD = 'Web'
      group by column2;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-22
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        • 2021-12-08
        • 2019-08-15
        • 2011-11-27
        • 1970-01-01
        相关资源
        最近更新 更多