首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Case when condition more than

SQL Case when condition more than
EN

Stack Overflow用户
提问于 2012-04-24 13:48:57
回答 2查看 634关注 0票数 0

我有productagegroup桌子。

我在匹配来自agegroup表的id和来自product表的agegroup时连接这两个表。

我使用的查询如下所示;

代码语言:javascript
复制
WITH CTE_AgeGroup AS                                                                            
                (
                SELECT  p.agegroup,
                      CASE
                             WHEN AgeFromMonths >=0 AND AgeToMonths <= 24 
                               THEN
                                    CASE 
                                          WHEN AgeFromMonths >=0 AND AgeToMonths <= 3 THEN '0-3 Months'
                                          WHEN AgeFromMonths >=3 AND AgeToMonths <= 6 THEN '3-6 Months'
                                          WHEN AgeFromMonths >=6 AND AgeToMonths <= 9 THEN '6-9 Months'
                                          WHEN AgeFromMonths >=9 AND AgeToMonths <= 12 THEN '9-12 Months'
                                          WHEN AgeFromMonths >=12 AND AgeToMonths <= 18 THEN '12-18 Months'
                                          WHEN AgeFromMonths >=18 AND AgeToMonths <= 24 THEN '18-24 Months'
                                          END  
                           END as  'age'
                FROM agegroup a inner join product p on
                a.id= p.agegroup

                ),
                  CTE_AgeGroupResultSet AS
                (
                   select
                        Age, Count(*) AS CountAge from CTE_AgeGroup  group by Age   
                      )
                select * from CTE_AgeGroupResultSet order by age;  

然而,我的问题是,如果产品A在“0-3个月”内列出,而产品B在“3-6个月”内列出,这两个产品不会在“0-24个月”内列出。

EN

回答 2

Stack Overflow用户

发布于 2012-04-24 17:14:40

您可以在group by中使用with rollup来获取总计数:

代码语言:javascript
复制
WITH CTE_AgeGroup AS
(
    SELECT p.agegroup,
           CASE WHEN AgeFromMonths >=0 AND AgeToMonths <= 24 
                THEN CASE WHEN AgeFromMonths >=0 AND AgeToMonths <= 3 
                          THEN '0-3 Months'
                          WHEN AgeFromMonths >=3 AND AgeToMonths <= 6 
                          THEN '3-6 Months'
                          WHEN AgeFromMonths >=6 AND AgeToMonths <= 9 
                          THEN '6-9 Months'
                          WHEN AgeFromMonths >=9 AND AgeToMonths <= 12 
                          THEN '9-12 Months'
                          WHEN AgeFromMonths >=12 AND AgeToMonths <= 18 
                          THEN '12-18 Months'
                          WHEN AgeFromMonths >=18 AND AgeToMonths <= 24 
                          THEN '18-24 Months'
                      END  
            END as 'age'
    FROM agegroup a 
         inner join product p 
            on a.id= p.agegroup
),
CTE_AgeGroupResultSet AS
(
    select case when grouping (Age) = 1 then '0-24' else Age end Age, 
           Count(*) AS CountAge 
      from CTE_AgeGroup
     group by Age WITH ROLLUP
)
select * 
  from CTE_AgeGroupResultSet 
 order by age;

此外,如果将varchar列添加到包含组描述的agegroup中,将完全消除大小写。

票数 1
EN

Stack Overflow用户

发布于 2012-04-24 13:57:18

我不确定为什么你会选择这种函数。最好使用UNION运算符(这只需要产品表和年龄组表的并集)

完全外连接(连接两个表并从两个表中获取数据,即使两个表中都有空值)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10292375

复制
相关文章

相似问题

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