分组依据创建重复的行

时间:2018-09-22 11:11:00

标签: sql oracle oracle10g

我正在使用Oracle sql创建示例数据 GridView ,并遇到一个非常基本的问题。因此,我要按月组织数据,根据状态列说一个月内没有雇员。因此状态= 0; 1月1日,状态> 0;一月2。我没有详细说明,因为它已经具有内置视图,而这正是我必须使用的功能。因此,这是我正在使用的查询,并且除了以下内容外,其他示例的输出效果都很好:

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拥有两个月的数据时,它会创建单独的行,尽管它应该在一行中。 有什么办法可以解决问题,而又保持GROUP BY呢?

更新1 :甚至尝试过此操作,但没有成功

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"

N :在视图中计入FirstLetter和SecondLetter。

1 个答案:

答案 0 :(得分:3)

SELECT DISTINCT几乎永远不适用于GROUP BY

您的问题是您在(MONTHNAMESHORT)中包含了GROUP BY

您的查询很难解密。但它应该看起来像这样:

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;