2016-06-01 2 views
0

У меня есть следующий сценарий:Как игнорировать нули в выражениях case с использованием аналитических функций?

Это мой SQL:

SELECT 
NAME, 
CASE WHEN ECHUE LIKE 'echue' 
    THEN sum(RESTE) over (partition by NAME ,ECHUE) 
END 
    as TOT_RESTE_ECHUE, 
sum(RESTE) over (partition by NAME) as TOT_RESTE_CLIENT, 
FROM TABLE 

Что я имею в таблице:

Name  | ECHUE  |RESTE 
-----------|-----------|--------- 
John  | ECHUE  | 20 
John  | ECHUE  | 20 
John  | null  | 20 
John  | ECHUE  | 20 

Что я получаю:

Name  | ECHUE  |RESTE |TOT_RESTE_ECHUE | TOT_RESTE_CLIENT 
-----------|-----------|---------|----------------|------------------ 
John  | ECHUE  | 20  |60    |80 
John  | ECHUE  | 20  |60    |80 
John  | null  | 20  |null   |80 
John  | ECHUE  | 20  |60    |80 

Что я хочу:

Name  | ECHUE  |RESTE |TOT_RESTE_ECHUE | TOT_RESTE_CLIENT 
-----------|-----------|---------|----------------|------------------- 
John  | ECHUE  | 20  |60    |80 
John  | ECHUE  | 20  |60    |80 
John  | null  | 20  |60    |80 
John  | ECHUE  | 20  |60    |80 

Я использую версию базы данных ORACLE 12. Я не могу использовать Where ECHUE IS NOT NULL, так как мне нужен TOT_RESTE_CLIENT для подсчета соответствия.

+0

вероятно, ваша самая легкая ставка - просто добавить 'where echue is not null' по вашему запросу. Возможны ли другие значения в столбце ECHUE, кроме ECHUE и null? – Boneist

+0

Нет, нет ECHUE или NULL. я не буду использовать, где echue не является нулевым, потому что мне нужно сделать то же самое, что и null в столбце ECHUE. –

ответ

2

Oracle Установка:

CREATE TABLE table_name (name, echue, reste) AS 
SELECT 'John', 'ECHUE', 20 FROM DUAL UNION ALL 
SELECT 'John', 'ECHUE', 20 FROM DUAL UNION ALL 
SELECT 'John', NULL, 20 FROM DUAL UNION ALL 
SELECT 'John', 'ECHUE', 20 FROM DUAL; 

Запрос:

SELECT t.* 
     SUM(CASE WHEN echue IS NOT NULL THEN reste END) 
     OVER (PARTITION BY name) AS tot_reste_echue 
FROM table_name t; 

Выход:

NAME ECHUE RESTE TOT_RESTE_ECHUE 
---- ----- ----- --------------- 
John ECHUE 20    60 
John ECHUE 20    60 
John   20    60 
John ECHUE 20    60 

Если вы также должны PARTITION BY в ECHUE колонке и включают NULL и 'ECHUE' значения вместе, то вы могли бы сделать:

SELECT t.* 
     SUM(CASE WHEN echue IS NOT NULL THEN reste END) 
     OVER (PARTITION BY name, COALESCE(echue, 'ECHUE')) AS tot_reste_echue 
FROM table_name t; 
0

Запрос для получения желаемых результатов состоит в следующем:

SELECT 
    name, 
    echue, 
    reste, 
    (SELECT SUM(reste) FROM test t2 WHERE t2.name = t1.name) AS tot_reste_echue 
FROM test t1 
+1

Я исправил ответ, надеясь, что вам нужно :-) – Carlo

0

Вот один из способов получения результатов с нулевой ECHUE строки все еще присутствует:

with sample_data as (select 'John' name, 'ECHUE' echue, 20 reste from dual union all 
        select 'John' name, null echue, 20 reste from dual union all 
        select 'John' name, 'ECHUE' echue, 20 reste from dual union all 
        select 'John' name, 'ECHUE' echue, 20 reste from dual) 
-- end of mimicking a table called sample_data with your data in it. See SQL below: 
select name, 
     echue, 
     reste, 
     case when echue = 'ECHUE' or echue is null then 
       sum(case when echue is null then 0 else reste end) over (partition by name) 
     end tot_reste_echue 
from sample_data; 

NAME ECHUE  RESTE TOT_RESTE_ECHUE 
---- ----- ---------- --------------- 
John ECHUE   20    60 
John ECHUE   20    60 
John ECHUE   20    60 
John    20    60 
Смежные вопросы