0

我正在尝试缩小我的结果范围,并且需要一些关于如何做到这一点的意见。

我要做的是缩小范围,以便向我显示每个“类型”的最大邮件日期。因此,在这种情况下,我希望它在 2020 年 7 月 17 日向我显示 CatID MF 用于插入销售,并在 2018 年 8 月 31 日向我显示 WK 用于核心。

我在想也许我需要在我的 Where 子句下写一个案例陈述,但我不确定我会如何写,或者这是否是最好的方法。任何帮助将不胜感激!

代码:

SELECT 
pc.packnum
,pc.CatID 
,MAX(cc.firstreleasemailed) as Maildate
,v.Type 
FROM pic704current pc JOIN
     CatCov cc 
     ON pc.CatID = cc.Offer AND
        pc.Year = cc.MailYear CROSS APPLY
     (VALUES (Case when cc.description like '%Promo%' then 'Promo' 
                   when cc.description like '%Sale%' then 'Insert Sale' 
                   when cc.Description like '%ins%' and cc.Description not like '%sale%' then 'Insert Core' 
                   when cc.description like '%ons%' then 'Onsert'
                   Else 'Core'
              end)
    ) v(type)
WHERE pc.DiscountReasonCode Not in ('LT','UP', 'OR', 'ER', 'IP', 'WT') 
AND
      cc.firstreleasemailed <= getdate() 
      And pc.PackNum = '6762846'
GROUP BY pc.packnum, pc.CatID, v.type

电流输出:

PackNum  CatID  MailDate    Type
-------  -----  ----------  -----------
6762846  WA     2018-07-20  Core
6762846  WQ     2018-07-20  Core
6762846  MK     2019-02-15  Insert Sale
6762846  MF     2020-07-17  Insert Sale
6762846  MP     2020-03-27  Insert Sale
6762846  WK     2018-08-31  Core
6762846  LD     2020-07-10  Insert Sale
6762846  WM     2020-07-01  Insert Sale
6762846  LK     2019-01-04  Insert Sale
4

1 回答 1

2

您可以重复中的case表达式group by。或者,正如我喜欢做的那样,使用apply

SELECT pc.packnum, pc.CatID, MAX(b.firstreleasemailed) as Maildate
       v.Type 
FROM pic704current pc JOIN
     CatCov cc 
     ON pc.CatID = cc.Offer AND
        pc.Year = cc.MailYear CROSS APPY
     (VALUES (Case when cc.description like '%Promo%' then 'Promo' 
                   when cc.description like '%Sale%' then 'Insert Sale' 
                   when cc.Description like '%ins%' and cc.Description not like '%sale%' then 'Insert Core' 
                   when cc.description like '%ons%' then 'Onsert'
                   Else 'Core'
              end)
    ) v(type)
WHERE pc.DiscountReasonCode Not in ('LT','UP', 'OR', 'ER', 'IP', 'WT') AND
      cc.firstreleasemailed <= getdate()
      pc.PackNum = '6762846'
GROUP BY pc.packnum, pc.CatID, v.type;

请注意,我还将表别名更改为表名的缩写,因此在阅读查询时它们是有意义的。使用有意义的表别名是最佳实践。

编辑:

如果您只希望每种类型都使用此功能,请从selectand中删除其他列group by

SELECT MAX(b.firstreleasemailed) as Maildate
       v.Type 
FROM pic704current pc JOIN
     CatCov cc 
     ON pc.CatID = cc.Offer AND
        pc.Year = cc.MailYear CROSS APPY
     (VALUES (Case when cc.description like '%Promo%' then 'Promo' 
                   when cc.description like '%Sale%' then 'Insert Sale' 
                   when cc.Description like '%ins%' and cc.Description not like '%sale%' then 'Insert Core' 
                   when cc.description like '%ons%' then 'Onsert'
                   Else 'Core'
              end)
    ) v(type)
WHERE pc.DiscountReasonCode Not in ('LT','UP', 'OR', 'ER', 'IP', 'WT') AND
      cc.firstreleasemailed <= getdate()
      pc.PackNum = '6762846'
GROUP BY v.type;
于 2020-10-20T15:36:21.037 回答