【问题标题】:Having count returning zero rows when it should return something当它应该返回某些东西时,计数返回零行
【发布时间】:2017-07-29 14:59:29
【问题描述】:
SELECT             
        P.P_DESC AS P,     
        D.PD_NAME AS D,     
        D.GPE_NBR AS GPE,     
        D.GPE_GEN_NM,
        D.GPE_2_ ,        
        D.GPE_4c , 
        SUBSTR (TRIM(C.FILL_DATE__ID),1,6),      
        C.fill_Date__ID,   
        Prod.PD_DESC ,
        DMC.M_A_NBR,
        DMC.MAD_NBR ,
        DMC.FT_NAME,
        DMC.LA_NAME,
        DDB.DATE_DATE, 
        CAST((CURRENT_DATE - DDB.DATE_DATE)/365.25  as Int) M_AGE_TODAY,
        RXDOC.PB_FT_NAME || ' ' || RXDOC.PB_LA_NAME ,
        RXDOC.PB_ID,
        DT.D_TYPE_DESC ,
        CASE WHEN SDL.GEPE IS NOT NULL THEN 'Y' ELSE 'N' END AS FLAG,
        COUNT (C.PHR_C_ID) AS CCount, 
        SUM (C.AMT_PAID) AS Spend
    FROM   O_PHAR_C C           
    INNER JOIN _D D ON C.D__ID=D.D__ID   
    INNER JOIN _P P               
        ON  C.P__ID = P.P__ID 
        AND C.P__ID = 00001
    INNER JOIN _M_CURR DMC ON C.PB_M_CURR_ID = DMC.M_CURR_ID
    INNER JOIN _M DM ON DM.M__ID  = DMC.M__ID 
    INNER JOIN _DATE  DDB ON DDB.DATE__ID = DM.BIRTH_DATE__ID 
    INNER JOIN _M_ELIG_CURR DMEC ON C.PB_M_ELIG_CURR_ID = DMEC.M_ELIG_CURR_ID
    LEFT OUTER JOIN BA_PROD_LAB_OWN.specialtyDList SDL
        ON D.GPE_NBR = SDL.GPE
        AND SDL.EFF_END_DATE >= CURRENT_DATE
    LEFT OUTER JOIN _PD Prod ON DMEC.PD__ID = Prod.PD__ID
    LEFT OUTER JOIN _RX_PB RXDOC ON  C.PB__ID=RXDOC.PB__ID 
    LEFT OUTER JOIN _PHAR_D_TYPE DT ON C.PHAR_D_TYPE__ID = DT.PHAR_D_TYPE__ID      
    WHERE C.fill_date__ID BETWEEN 20170201 AND 20170228
        AND C.RE_I = 'N'   
        AND C.sR__ID IN (96,13,203)   
    GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14, 15, 16, 17, 18, 19
        HAVING COUNT(*) >= 10;

我想使用此查询返回大于或等于 10 的 C.PHR_C_ID 实例。但是,当我将 select 语句限制为该列时,我得到了所需的结果,但是当我将所有这些列添加到它“有计数”返回 0。有多个记录;我认为查询有问题。

【问题讨论】:

    标签: sql database teradata data-warehouse


    【解决方案1】:

    问题在于,当您添加字段并按它们分组时,您会获得该不同字段列表的记录计数。您可能可以改用 QUALIFY 语句。这将通过不同的 C.PHR_C_ID 忽略其他字段来总结结果,然后返回具有 count(*) >= 10 的不同 C.PHR_C_ID 的任何字段。

    SELECT             
                                P.P_DESC AS P,     
                                D.PD_NAME AS D,     
                                D.GPE_NBR AS GPE,     
                                D.GPE_GEN_NM,
                                D.GPE_2_ ,        
                                D.GPE_4c , 
                                SUBSTR (TRIM(C.FILL_DATE__ID),1,6),      
                                C.fill_Date__ID,   
                                Prod.PD_DESC ,
                                DMC.M_A_NBR,
                                DMC.MAD_NBR ,
                                DMC.FT_NAME,
                                DMC.LA_NAME,
                                DDB.DATE_DATE, 
                                CAST((CURRENT_DATE - DDB.DATE_DATE)/365.25  as Int) M_AGE_TODAY,
    
                                RXDOC.PB_FT_NAME || ' ' || RXDOC.PB_LA_NAME ,
                                RXDOC.PB_ID,
                                DT.D_TYPE_DESC ,
                                CASE
                                                WHEN SDL.GEPE IS NOT NULL THEN 'Y'
                                                ELSE 'N'
                                END AS FLAG,
    
                              COUNT(*) OVER (PARTITION BY C.PHR_C_ID) AS CCount, 
    
                              C.AMT_PAID AS Spend
    
                FROM   O_PHAR_C C           
    
    
            INNER JOIN _D D 
                                ON  C.D__ID=D.D__ID   
    
    
            INNER JOIN _P P               
                ON  C.P__ID = P.P__ID 
                AND C.P__ID = 00001
    
    
    
    
    
            INNER JOIN _M_CURR DMC
                ON C.PB_M_CURR_ID = DMC.M_CURR_ID
    
                INNER JOIN _M DM 
                ON DM.M__ID  = DMC.M__ID 
    
                INNER JOIN _DATE  DDB
                ON DDB.DATE__ID = DM.BIRTH_DATE__ID 
    
                INNER JOIN _M_ELIG_CURR DMEC
                                ON C.PB_M_ELIG_CURR_ID = DMEC.M_ELIG_CURR_ID
    
                LEFT OUTER JOIN BA_PROD_LAB_OWN.specialtyDList SDL
                                ON D.GPE_NBR = SDL.GPE
                                AND SDL.EFF_END_DATE >= CURRENT_DATE
    
                LEFT OUTER JOIN _PD Prod
                                ON DMEC.PD__ID = Prod.PD__ID
    
          LEFT OUTER JOIN _RX_PB RXDOC 
                                ON  C.PB__ID=RXDOC.PB__ID 
    
          LEFT OUTER JOIN _PHAR_D_TYPE DT
                                ON C.PHAR_D_TYPE__ID = DT.PHAR_D_TYPE__ID
    
    
                     WHERE 
                    C.fill_date__ID BETWEEN 20170201 AND 20170228
                    AND C.RE_I = 'N'   
                    AND C.sR__ID IN (96,13,203)   
                   QUALIFY COUNT(*) OVER (PARTITION BY C.PHR_C_ID) >= 10;
    

    【讨论】:

    • 您也必须删除 GROUP BY 并在 Select 列表中切换到 COUNT/SUM OVER
    • 使用 GROUP BY 和 Qualify 的双重聚合总是让我着迷。
    • 谢谢你能提供我如何实现这一目标的例子吗?谢谢
    • 如果我这样运行代码,它不会返回任何结果。但是,当我修改它并删除一些列时,我会得到我正在寻找的结果。
    • @JNevill SELECT P.P_DESC AS P, DMC.MAD_NBR, DMC.FT_NAME, DMC.LA_NAME, DDB.DATE_DATE, CAST((CURRENT_DATE - DDB.DATE_DATE)/365.25 as Int) M_AGE_TODAY, COUNT () AS CCount,SUM(C.AMT_PAID) AS Spend GROUP BY 1,2,3,4,5,6,7,8,9 HAVING COUNT() >=10
    猜你喜欢
    • 2017-11-06
    • 2013-09-18
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 2020-10-14
    • 2010-10-22
    相关资源
    最近更新 更多