带有布尔运算符的 SQL CASE 语句



请参阅语句:

SELECT      t1.region, 
Count(t1.orders) AS orders, 
CASE t1.week 
                      WHEN < '5' THEN 'APR' 
                      WHEN < '10' THEN 'MAY' 
                      WHEN < '14' THEN 'JUN' 
                      WHEN < '19' THEN 'JUL' 
                      WHEN < '23' THEN 'AUG' 
                      WHEN < '27' THEN 'SEP' 
                      WHEN < '32' THEN 'OCT' 
                      WHEN < '36' THEN 'NOV' 
                      WHEN < '40' THEN 'DEC' 
                      WHEN < '45' THEN 'JAN' 
                      WHEN < '49' THEN 'FEB' 
                      WHEN < '53' THEN 'MAR' 
END AS month, 
dbo.inf_dates.months
FROM        dbo.[NonVoice Weekly_InflowCOMCAN] AS t1 
INNER JOIN  dbo.inf_dates 
ON t1.week = dbo.inf_dates.fin_wk
WHERE       notes = 'Weekly COMPLETED'
AND ([2MB/sub]) = 'ETH' 
AND dbo.inf_dates.date > CONVERT(datetime, '2017-04-03 00:00:00', 102)
GROUP BY   t1.region 
           ,dbo.inf_dates.months 

如您所见,我正在尝试通过创建月份列并将周分组在一起来对带有月份的行进行分组,而不是表中的周数。当我做像CASE WHEN t1.Week < '5' THEN 'APR'这样的案例陈述时,我得到了正确的结果,但它迫使我按周分组,这不是我想要的。顺便说一下,表中的两个月列是不同的。

这是正确的格式,将varchar<符号进行比较也很奇怪,
也许您必须先将周转换为整数。
顺便说一句,如果一周大于或等于 53 怎么办?

此外,您最好使用相应的表,而不是对案例进行硬编码。

SELECT      t1.region, 
Count(t1.orders) AS orders, 
CASE 
WHEN t1.week < 5 THEN 'APR'
WHEN t1.week < 10 THEN 'MAY'
WHEN t1.week < 14 THEN 'JUN' 
WHEN t1.week < 19 THEN 'JUL' 
WHEN t1.week < 23 THEN 'AUG' 
WHEN t1.week < 27 THEN 'SEP' 
WHEN t1.week < 32 THEN 'OCT' 
WHEN t1.week < 36 THEN 'NOV' 
WHEN t1.week < 40 THEN 'DEC' 
WHEN t1.week < 45 THEN 'JAN' 
WHEN t1.week < 49 THEN 'FEB' 
WHEN t1.week < 53 THEN 'MAR' 
ELSE 'DEFAULT VALUE'
END AS month, 
dbo.inf_dates.months
FROM        dbo.[NonVoice Weekly_InflowCOMCAN] AS t1 
INNER JOIN dbo.inf_dates 
ON t1.week = dbo.inf_dates.fin_wk
WHERE       notes = 'Weekly COMPLETED'
AND [2MB/sub]) = 'ETH' 
AND dbo.inf_dates.date > CONVERT(datetime, '2017-04-03 00:00:00', 102)
GROUP BY   t1.region 
,dbo.inf_dates.months 

最新更新