【问题标题】:How to write value based on combination of other values如何根据其他值的组合写入值
【发布时间】:2019-08-02 09:05:35
【问题描述】:

示例数据如下所示:

目标是:

如果我们有相同的ControlNoActionDate(包括时间) 以及Action = 'Changed status''Print Quote' 然后'Print Quote' 的组合

如果我们有相同的ControlNoActionDate(包括时间) 以及 Action = 'Changed status''Reason for quote' 然后 'Changed Status' 的组合

查询示例:

declare @TempTable table (
    Name varchar(50), 
    ControlNo int, 
    PolicyNumber varchar(50), 
    Action varchar(max), 
    ActionDate datetime
)


insert into @TempTable values 
    ('Jim',54321, NULL, 'Changed status','2019-01-29 09:56:12.820' ),
    ('Jim',54321, NULL, 'Print Quote','2019-01-29 09:56:12.820' ),
    ('Brian',12345, NULL, 'Changed status','2019-02-15 11:18:07.356' ),
    ('Brian',12345, NULL, 'Reason for quote','2019-02-15 11:18:07.356') 

select * from @TempTable

理想的结果应该是这样的:

我试图通过以下方式实现:

select   
    name, 
    ControlNo, 
    PolicyNumber, 
    case 
        when  action in( 'Changed status','Print Quote') then 'Print Quote'
        when action in ('Changed status', 'Reason for quote') then 'Changed Status'
        else Action end as Action
from @TempTable
group by 
    name, 
    ControlNo, 
    PolicyNumber, 
    Action

但它没有给我正确的结果:

【问题讨论】:

    标签: sql sql-server tsql sql-server-2012 case


    【解决方案1】:

    请注意,“IN”条件相当于“OR”。

    有帮助的代码:

    SELECT a.Name,a.ControlNo,a.PolicyNumber,a.Action,a.ActionDate
    FROM (
        SELECT t.Name,t.ControlNo,t.PolicyNumber
            ,CASE 
                WHEN t2.Action = 'Print Quote' THEN 'Print Quote'
                WHEN t2.Action = 'Reason for quote' THEN 'Changed status'
            END AS [Action]
            ,t.ActionDate
        FROM @TempTable t
        LEFT JOIN @TempTable t2 ON t2.ControlNo = t.ControlNo AND t2.ActionDate = t.ActionDate AND t2.Action <> t.Action
        WHERE t.Action = 'Changed status'
    ) a
    GROUP BY a.Name,a.ControlNo,a.PolicyNumber,a.Action,a.ActionDate
    ;
    

    【讨论】:

      【解决方案2】:

      您应该能够在不使用子查询的情况下实现这一点,通过使用条件聚合来实现逻辑:

      SELECT
          Name, 
          ControlNo, 
          PolicyNumber,
          ActionDate,
          CASE 
              WHEN MAX(CASE WHEN Action = 'Changed status'  THEN 1 END) = 1 
              AND  MAX(CASE WHEN Action = 'Print Quote'     THEN 1 END) = 1
                  THEN 'Print Quote'
              WHEN MAX(CASE WHEN Action = 'Changed status'   THEN 1 END) = 1 
              AND  MAX(CASE WHEN Action = 'Reason for quote' THEN 1 END) = 1
                  THEN 'Changed Status'
              ELSE MAX(Action)
          END AS Action
      FROM @TempTable
      GROUP BY 
          Name, 
          ControlNo, 
          PolicyNumber, 
          ActionDate
      

      注意:在我看来,包含ActionDate 列的结果更有意义(因为它是非聚合列的一部分)。

      demo on DB Fiddle 产生:

      姓名 |控制编号 |保单号码 |行动日期 |行动 :---- | --------: | :----------- | :----------------- | :------------- 布赖恩 | 12345 | | 15/02/2019 11:18:07 |更改状态 吉姆 | 54321 | | 29/01/2019 09:56:12 |打印报价

      【讨论】:

      • 是的,必须包含 ActionDate。抱歉,我忘了把它放在我的选择语句中
      猜你喜欢
      • 1970-01-01
      • 2020-10-24
      • 2015-11-09
      • 2018-04-15
      • 1970-01-01
      • 2019-05-01
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多