2015-07-14 2 views
2

Теперь у меня есть следующий SQL:Как объединить «похожие» строки в SQL?

SELECT * FROM ( 
    SELECT Employee, Template, TRUNC(A.FROM) DATE_FROM, SUM(B.AMOUNTTOTAL) AMNT_TOTAL, SUM(B.AMOUNT) AMNT 
    FROM Table1 A, Table2 B, Table3 C 
    WHERE ... 
    GROUP BY Employee, Template, TRUNC(A.FROM) 
    ) 
    PIVOT 
    (
    SUM (AMNT_TOTAL) 
     FOR DATE_FROM IN ('01-MAY-2015' date1, '02-MAY-2015' date2, '03-MAY-2015' date3) 
    ) 

И результат запроса:

+------------+------------+--------+---------+---------+---------+ 
| Employee | Template | AMNT | DATE1 | DATE2 | DATE3 | 
+------------+------------+--------+---------+---------+---------+ 
| Kate  | TemplA  | 2 |   | 12 |   | 
| Kate  | TemplA  | 4 |   |   |   | 
| Kate  | TemplA  | 7 | 16 |   | 14 | 
| John  | TemplB  | 5 | 18 | 25 |   | 
+------------+------------+--------+---------+---------+---------+ 

Как преобразовать данные в следующем виде:

+------------+------------+---------+---------+---------+ 
| Employee | Template | DATE1 | DATE2 | DATE3 | 
+------------+------------+---------+---------+---------+ 
| Kate  | TemplA  | 16|7 | 12|2 | 14|7 | 
| John  | TemplB  | 18|5 | 25|5 |   | 
+------------+------------+---------+---------+---------+ 

Я знаю, что могу использовать конкатенацию оператор: добавить внешний запрос:

SELECT 
    Employee, 
    Template, 
    CASE WHEN DATE1 IS NOT NULL THEN DATE1||'|'||AMNT END DATE0, 
    ... 
    FROM (old_query) 

Но как сгруппировать?

+0

Вы уверены, что вы не будете иметь никаких дубликатов для данной пары дата/шаблон? –

+0

Да, я уверен, поскольку я пытаюсь повторить функциональность из старого приложения с теми же данными – Darkwing

ответ

0

Вы можете использовать max всегда получить нон нулевое значение:

SELECT 
    Employee, 
    Template, 
    max (DATE1||'|'||AMT) DATE1, 
    ... 
    FROM (old_query) 
    GROUP BY Employee, Template 
+0

Спасибо за подсказку с MAX, он работает – Darkwing

Смежные вопросы