Sql 计数、拥有和案例陈述

Sql 计数、拥有和案例陈述,sql,group-by,db2,case,having,Sql,Group By,Db2,Case,Having,我希望基于3种不同的DB2数据库条件生成一些项目。我需要计算所有项目=0.5和>=1.00的使用百分比,但只能按dim\u building\u id和building\u name进行分组。当然,此查询将不会运行,因为它需要用于添加到group by的百分比。使用百分比_时,如何处理这3种情况 SELECT SUM(CAST(FTS.GROUP_A AS BIGINT)) AS GROUP_A, SUM(CAST(FTS.GROUP_B AS BIGINT)) AS GROUP

我希望基于3种不同的DB2数据库条件生成一些项目。我需要计算所有项目=0.5和>=1.00的使用百分比,但只能按dim\u building\u id和building\u name进行分组。当然,此查询将不会运行,因为它需要用于添加到group by的百分比。使用百分比_时,如何处理这3种情况

SELECT
SUM(CAST(FTS.GROUP_A AS BIGINT)) AS GROUP_A,
        SUM(CAST(FTS.GROUP_B AS BIGINT)) AS GROUP_B,
        SUM(CAST(FTS.GROUP_C AS BIGINT)) AS GROUP_C,


                CASE WHEN FAT.PERCENTAGE_USED <= '0.10'
                THEN COUNT(*)
                END AS PROJECTS_L10,
                CASE WHEN FAT.PERCENTAGE_USED >= '0.50' 
                THEN COUNT(*)
                END AS PROJECTS_G50,
                CASE WHEN FAT.PERCENTAGE_USED >= '1.00' 
                THEN COUNT(*)
                END AS PROJECTS_G100,
        DAYS(DATE('2014-07-01')) - DAYS(CURRENT DATE)  AS DAYS_LEFT,
        (DAYS(DATE('2014-07-01')) - DAYS(CURRENT DATE))/7 AS WEEKS_LEFT, 
        DAYS(DATE('2013-12-31')) - DAYS(CURRENT DATE) AS DAYS_LEFT_YEAR      

FROM FACT_TABLE AS FAT
INNER JOIN GROUPS AS FTS ON FAT.DIM_PROJECT_ID = FTS.DIM_PROJECT_ID
GROUP BY FAT.DIM_BUILDING_ID, FAT.BUILDING_NAME;

将CASE语句包装在聚合中,而不是将聚合作为

SELECT
SUM(CAST(FTS.GROUP_A AS BIGINT)) AS GROUP_A,
        SUM(CAST(FTS.GROUP_B AS BIGINT)) AS GROUP_B,
        SUM(CAST(FTS.GROUP_C AS BIGINT)) AS GROUP_C,  
        SUM(CASE WHEN FAT.PERCENTAGE_USED <= '0.10' THEN 1 ELSE 0 END) AS PROJECTS_L10,
        SUM(CASE WHEN FAT.PERCENTAGE_USED >= '0.50' THEN 1 ELSE 0 END) AS PROJECTS_G50,
        SUM(CASE WHEN FAT.PERCENTAGE_USED >= '1.00' THEN 1 ELSE 0 END) AS PROJECTS_G100,
        DAYS(DATE('2014-07-01')) - DAYS(CURRENT DATE)  AS DAYS_LEFT,
        (DAYS(DATE('2014-07-01')) - DAYS(CURRENT DATE))/7 AS WEEKS_LEFT, 
        DAYS(DATE('2013-12-31')) - DAYS(CURRENT DATE) AS DAYS_LEFT_YEAR      

FROM FACT_TABLE AS FAT
INNER JOIN GROUPS AS FTS ON FAT.DIM_PROJECT_ID = FTS.DIM_PROJECT_ID
GROUP BY FAT.DIM_BUILDING_ID, FAT.BUILDING_NAME;

将CASE语句包装在聚合中,而不是将聚合作为

SELECT
SUM(CAST(FTS.GROUP_A AS BIGINT)) AS GROUP_A,
        SUM(CAST(FTS.GROUP_B AS BIGINT)) AS GROUP_B,
        SUM(CAST(FTS.GROUP_C AS BIGINT)) AS GROUP_C,  
        SUM(CASE WHEN FAT.PERCENTAGE_USED <= '0.10' THEN 1 ELSE 0 END) AS PROJECTS_L10,
        SUM(CASE WHEN FAT.PERCENTAGE_USED >= '0.50' THEN 1 ELSE 0 END) AS PROJECTS_G50,
        SUM(CASE WHEN FAT.PERCENTAGE_USED >= '1.00' THEN 1 ELSE 0 END) AS PROJECTS_G100,
        DAYS(DATE('2014-07-01')) - DAYS(CURRENT DATE)  AS DAYS_LEFT,
        (DAYS(DATE('2014-07-01')) - DAYS(CURRENT DATE))/7 AS WEEKS_LEFT, 
        DAYS(DATE('2013-12-31')) - DAYS(CURRENT DATE) AS DAYS_LEFT_YEAR      

FROM FACT_TABLE AS FAT
INNER JOIN GROUPS AS FTS ON FAT.DIM_PROJECT_ID = FTS.DIM_PROJECT_ID
GROUP BY FAT.DIM_BUILDING_ID, FAT.BUILDING_NAME;

我会这样做:

select bn.building_name ,
       t.*
from ( select fat.building_id ,
              sum( case when fat.percentage_used <= 0.10                                then 1 else 0 end ) as group_a ,
              sum( case when fat.percentage_used >  0.10 and fat.percentage_used < 0.50 then 1 else 0 end ) as group_b ,
              sum( case when fat.percentage_used >= 0.50 and fat.percentage_used < 1.00 then 1 else 0 end ) as group_c ,
              sum( case when fat.percentage_used >= 1.00                                then 1 else 0 end ) as group_d ,
              sum( case when fat.percentage_used is null                                then 1 else 0 end ) as group_e
       from fact_table fat
       join groups     fts on tfs.dim_project_id = fat.dim_project_id
       group by fat.building_id
     ) t
join fact_table bn on bn.building_id = t.building_id

我会这样做:

select bn.building_name ,
       t.*
from ( select fat.building_id ,
              sum( case when fat.percentage_used <= 0.10                                then 1 else 0 end ) as group_a ,
              sum( case when fat.percentage_used >  0.10 and fat.percentage_used < 0.50 then 1 else 0 end ) as group_b ,
              sum( case when fat.percentage_used >= 0.50 and fat.percentage_used < 1.00 then 1 else 0 end ) as group_c ,
              sum( case when fat.percentage_used >= 1.00                                then 1 else 0 end ) as group_d ,
              sum( case when fat.percentage_used is null                                then 1 else 0 end ) as group_e
       from fact_table fat
       join groups     fts on tfs.dim_project_id = fat.dim_project_id
       group by fat.building_id
     ) t
join fact_table bn on bn.building_id = t.building_id

不错的想法是在范围内添加,但根据问题中的值,没有迹象表明需要范围。不错的想法是在范围内添加,但根据问题中的值,没有迹象表明需要范围。实际上,您选择了中的最后一个,但很乐意提供帮助。实际上,您选择了中的最后一个,但我很乐意帮忙。