代码之家  ›  专栏  ›  技术社区  ›  AT-2017

分组方式创建重复行

  •  -1
  • AT-2017  · 技术社区  · 6 年前

    我正在使用 Oracle sql来创建示例数据 网格视图

    SELECT DISTINCT SYEAR, DEPT_NAME,
    
    --Month-wise data - Starts
    DECODE ( upper((MONTHNAMESHORT)), 'JAN', NVL((FirstLetter), 0), NULL) "JAN1" ,  
    DECODE ( upper((MONTHNAMESHORT)), 'JAN', NVL((SecondLetter), 0), NULL) "JAN2",
    DECODE ( upper((MONTHNAMESHORT)), 'FEB', NVL((FirstLetter), 0), NULL) "FEB1" ,  
    DECODE ( upper((MONTHNAMESHORT)), 'FEB', NVL((SecondLetter), 0), NULL) "FEB2"
    --Month-wise data - Ends
    
    FROM
    
    --Sub-query - starts
    (SELECT DISTINCT VWWEBLETTERSTATUS2.SYEAR, MONTHRANK.MONTHNAMESHORT,VWWEBLETTERSTATUS2.DEPT_NAME,
      nvl(fnfirstletter(DEPT_NAME,upper(MONTHRANK.MONTHNAMESHORT),VWWEBLETTERSTATUS2.SYEAR),0) FirstLetter,
      nvl(fnSecondLetter(DEPT_NAME,upper(MONTHRANK.MONTHNAMESHORT),VWWEBLETTERSTATUS2.SYEAR),0) SecondLetter,MONTHRANK.RANK  
      FROM
    MONTHRANK,VWWEBLETTERSTATUS2 where VWWEBLETTERSTATUS2.SYEAR = '2018' AND
      nvl(fnfirstletter(DEPT_NAME,upper(MONTHRANK.MONTHNAMESHORT),VWWEBLETTERSTATUS2.SYEAR), 0) <> 0 AND
      nvl(fnSecondLetter(DEPT_NAME,upper(MONTHRANK.MONTHNAMESHORT),VWWEBLETTERSTATUS2.SYEAR), 0) <> 0
    order by DEPT_NAME, rank) q
    --Sub-query - Ends
    
    GROUP BY SYEAR, (MONTHNAMESHORT), DEPT_NAME; --Issue here - For the month-wise group by
    

    输出

    Year    Dept    Jan1 Jan2 Feb1 Feb2
    2018    UNIT-I3 93   87             
    2018    UNIT-I5 62   66
    2018    QA      0    0      
    2018    UNIT-I5           87   66
    

    来这里是为了 GROUP BY (MONTHNAMESHORT)子句,它为部门和特定年份创建重复行。假设Unit-I5有这两个月的数据,它会创建单独的行,尽管它应该在一行中。 任何克服问题的方法保持不变,只是一个替代品 分组依据 ?

    :甚至尝试过这个,但没有成功

    SUM(CASE WHEN Q.MONTHNAMESHORT = 'JAN' THEN Q.FirstLetter ELSE 0 END) "JAN1",
    SUM(CASE WHEN Q.MONTHNAMESHORT = 'JAN' THEN Q.SecondLetter ELSE 0 END) "JAN2"
    

    :视图中统计第一个字母和第二个字母。

    1 回复  |  直到 6 年前
        1
  •  3
  •   mathguy    6 年前

    SELECT DISTINCT GROUP BY .

    你的问题是你包括 (MONTHNAMESHORT) 分组依据

    你的问题很难破译。但应该是这样的:

    SELECT SYEAR, DEPT_NAME,
           SUM(CASE WHEN upper(MONTHNAMESHORT) = 'JAN' THEN FirstLetter END) as "JAN1" ,  
           SUM(CASE WHEN upper(MONTHNAMESHORT) = 'JAN' THEN SecondLetter END) as "JAN2" ,  
           SUM(CASE WHEN upper(MONTHNAMESHORT) = 'FEB' THEN FirstLetter END) as "FEB1" ,  
           SUM(CASE WHEN upper(MONTHNAMESHORT) = 'FEB' THEN SecondLetter END) as "FEB2" 
    FROM . . . 
    GROUP BY SYEAR, DEPT_NAME;