2014-10-13 3 views
0

이것은 내 작품입니다.SQL Oracle (group by)

Name   Start  End 
------  -------- -------- 
Mary  09-04-01 10-04-30 
John  08-05-25 11-07-24 
Alisa  07-07-07 11-06-28 
Mary  06-06-06 12-12-20 
John  05-05-05 12-12-20 
Alex  04-04-04 11-12-20 
Alisa  03-03-03 13-12-20 
Mary  09-04-04 13-12-21 
John  08-06-06 13-04-30 
John  08-06-01 14-04-30 

나는 GROUP BY 모든 이름에, 각 사람에 대한 MIN() START을 얻고 MAX() END을받을 필요가있다. 그런 다음, START이 같은 END의 차이는 :

Name   Start  End   Difference 
-------  -------- -------- ---------- 
Mary  06-06-06 13-12-21 MONTHS_BETWEEN(start,end) 
John  05-05-05 14-04-30 MONTHS_BETWEEN(start,end) 
Alisa  03-03-03 13-12-20 MONTHS_BETWEEN(start,end) 
Alex  04-04-04 11-12-20 MONTHS_BETWEEN(start,end) 

이 내 쿼리입니다. 나는이 결과를 얻을 수있을 뿐이며, 나는 왜 모든 사람이 GROUP BY를 할 수 없는지 모른다. difference에서 올바르게 작동하는 것 같습니다. FROM을 제외합니다.

ERROR at line 1: 
ORA-00979: not a GROUP BY expression 

tableDate.Start and tableDate.End are calculated columns so i dont know why i've to put them in the GROUP BY clause. 

감사합니다 : 나는 GROUP BY에서 table.Date.StarttableDate.End을 제거하면

SELECT table.name, MIN(tableDate.Start), MAX(tableDate.end), 
Round(MONTHS_BETWEEN(tableDate.end, tableDate.Start),0) as Difference 
FROM (....) 
GROUP BY table.name,tableDate.Start, tableDate.End 
; 

, 오라클은 나에게 오류가 주어집니다!

답변

1

글쎄, name 열로 그룹화해야합니다. 그러나 귀하의 질문에 대한 한 가지 문제는 계산 사이의 개월이 MAXMIN 값을 사용해야한다는 것입니다.

SELECT T.name, 
     MIN(T.Start) AS Start, 
     MAX(T."end") AS "End", 
     ROUND(MONTHS_BETWEEN(MAX(T."end"),MIN(T.Start)),0) as "Difference" 
FROM YourTable T 
GROUP BY T.name; 
+0

완벽하게 작동합니다. 고마워요! 나는 함수 내에서 계산을한다고 생각하지 않았다. – Thapipo

0

모든 비 집계 그룹화에있을 필요가 있고, Round(MONTHS_BETWEEN....은 집계와 tableDate.StarttableDate.End을 소개하지 않습니다 당신은 또한 열 이름 일부 예약 된 단어를 사용하고 있습니다. 데이터의 해석에 따라 MONTHS_BETWEEN 계산에서 이미 계산 된 MINMAX 값을 사용하려는 것 같습니다. 어때요?

WITH cte AS 
(
    SELECT table.name, MIN(tableDate.Start) AS MinStart, MAX(tableDate.end) as MaxEnd 
    FROM (....) 
    GROUP BY table.name 
) 
SELECT name, MinStart, MaxEnd, Round(MONTHS_BETWEEN(MaxEnd, MinStart),0) as Difference 
FROM cte;