首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在GROUP BY中使用CASE的替代方法

在GROUP BY中使用CASE的替代方法
EN

Stack Overflow用户
提问于 2019-08-28 07:54:04
回答 2查看 82关注 0票数 0

我正在尝试寻找一种更紧凑的代码形式和更快的方式来执行需要(或者至少我认为需要)按两个case语句分组的查询

我试过使用OVER PARTITION,但似乎不能得到想要的结果

代码语言:javascript
复制
SELECT 
    CASE
        WHEN AA.BUSINESS_SEGMENT LIKE 'YEPPERS%'
        THEN 'YES'
        ELSE 'NO'
    END 'YZY',
    CASE
        WHEN MONTH(POI.EX_FACTORY_DATE) >= 1 AND MONTH(POI.EX_FACTORY_DATE) <=3
        THEN
            'Q1'
        WHEN MONTH(POI.EX_FACTORY_DATE) >= 4 AND MONTH(POI.EX_FACTORY_DATE) <=6
        THEN
            'Q2'
        WHEN MONTH(POI.EX_FACTORY_DATE) >= 7 AND MONTH(POI.EX_FACTORY_DATE) <=9
        THEN
            'Q3'
        WHEN MONTH(POI.EX_FACTORY_DATE) >= 10 AND MONTH(POI.EX_FACTORY_DATE) <=12
        THEN
            'Q4'
    END 'QTR',
    SUM(POI.PO_ORDERED_QUANTITY) PO_QTY
FROM VW_PO_ITEM POI
LEFT JOIN VW_ARTICLE_ATTRIBUTES AA ON AA.ARTICLE = POI.MATERIAL 
WHERE POI.DEL_INDICATOR <> 'L' AND POI.EX_FACTORY_DATE BETWEEN '7/1/2019' AND '12/31/2019' AND ((POI.SHIPPING_INSTRUCT='A2' AND AA.BUSINESS_SEGMENT NOT LIKE 'YEPPERS%') OR AA.BUSINESS_SEGMENT LIKE 'YEPPERS%')
GROUP BY
    CASE
        WHEN AA.BUSINESS_SEGMENT LIKE 'YEPPERS%'
        THEN 'YES'
        ELSE 'NO'
    END, 
    CASE
        WHEN MONTH(POI.EX_FACTORY_DATE) >= 1 AND MONTH(POI.EX_FACTORY_DATE) <=3
        THEN
            'Q1'
        WHEN MONTH(POI.EX_FACTORY_DATE) >= 4 AND MONTH(POI.EX_FACTORY_DATE) <=6
        THEN
            'Q2'
        WHEN MONTH(POI.EX_FACTORY_DATE) >= 7 AND MONTH(POI.EX_FACTORY_DATE) <=9
        THEN
            'Q3'
        WHEN MONTH(POI.EX_FACTORY_DATE) >= 10 AND MONTH(POI.EX_FACTORY_DATE) <=12
        THEN
            'Q4'
    END 
代码语言:javascript
复制
--desired result (the query above does produce this) 

YZY      QTR  PO_QTY
-------- ---- ---------------------------------------
NO       Q4   389309
YES      Q4   649842
YES      Q3   843438
NO       Q3   20146
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-28 08:38:05

考虑使用CTE在最终聚合之前处理单元级别的计算,以避免重复。另外,查看DatePart以从日期时间字段中提取日期部分:

代码语言:javascript
复制
WITH cte AS (
   SELECT CASE 
               WHEN AA.BUSINESS_SEGMENT LIKE 'YEPPERS%' 
               THEN 'YES' ELSE 'NO' 
          END [YZY], 
          DATEPART(qq, POI.EX_FACTORY_DATE) AS [QTR], 
          POI.PO_ORDERED_QUANTITY
   FROM VW_PO_ITEM POI 
   LEFT JOIN VW_ARTICLE_ATTRIBUTES AA 
       ON AA.ARTICLE = POI.MATERIAL 
   WHERE POI.DEL_INDICATOR <> 'L' 
     AND POI.EX_FACTORY_DATE BETWEEN '2019-07-01' AND '2019-12-31' 
     AND (
          (POI.SHIPPING_INSTRUCT='A2' 
           AND AA.BUSINESS_SEGMENT NOT LIKE 'YEPPERS%') 
          OR 
           AA.BUSINESS_SEGMENT LIKE 'YEPPERS%'
         ) 
  ) 

SELECT [YZY], [QTR],
       SUM(POI.PO_ORDERED_QUANTITY) AS PO_QTY 
FROM cte
GROUP BY [YZY], [QTR]
票数 1
EN

Stack Overflow用户

发布于 2019-08-28 08:17:12

我认为使用DATEPART(季度)更好

代码语言:javascript
复制
FROM MyTable
GROUP BY DATEPART(quarter, columndate)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57683438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档