2014-09-30 2 views
0

Я пытаюсь вычесть два столбца, а затем подсчитать, сколько из них имеет ту же самую разницу и поместить эти суммы в столбцы. Суммы, из которых имеют разницу в -3 или более, -2, -1, 0, 1, 2, 3 или более, сгруппированы по дате.Подведение итогов в несколько новых столбцов, сгруппированных по другому столбцу

Запрос должен быть выполнен в отношении базы данных DB2.

данных ...

------------------------------ 
| Date  | Num 1 | Num 2 | 
------------------------------ 
| 2014-02-11 | 19872 | 19873 | 
| 2014-02-11 | 19873 | 19873 | 
| 2014-02-12 | 19875 | 19873 | 
| 2014-02-13 | 19870 | 19873 | 
| 2014-02-13 | 19872 | 19873 | 
| 2014-02-14 | 19877 | 19869 | 
| 2014-02-14 | 19873 | 19873 | 

Желаемая выход ...

----------------------------------------------------------------------- 
| Date  | <= -3 | -2 | -1 | 0 | +1 | +2 | >= +3 | 
----------------------------------------------------------------------- 
| 2014-02-11 |  0 | 0 | 0 | 1 | 1 | 0 | 0 | 
| 2014-02-12 |  0 | 1 | 0 | 0 | 0 | 0 | 0 | 
| 2014-02-13 |  0 | 0 | 0 | 0 | 1 | 0 | 1 | 
| 2014-02-14 |  1 | 0 | 0 | 1 | 9 | 0 | 0 | 
+0

Пробовали ли вы что-нибудь? – bfontaine

+0

В конечном счете, вы ищете стержень: http://stackoverflow.com/questions/13579143/how-can-i-pivot-a-table-in-db2 – DanK

+0

@DanK Итак, это ** Pivot **? Это была половина проблемы. Я просто не знаю, что правильно назвать тем, что я пытаюсь сделать. Таким образом, это делает Googling довольно сложным. Благодаря! – Chad

ответ

2

Попробуйте это:

select Date, 
 
sum(case when diff <= -3 then 1 else 0) AS [<=-3], 
 
sum(case when diff = -2 then 1 else 0) AS [-2], 
 
sum(case when diff = -1 then 1 else 0) AS [-1], 
 
sum(case when diff = 0 then 1 else 0) AS [0], 
 
sum(case when diff = 1 then 1 else 0) AS [+1], 
 
sum(case when diff = 2 then 1 else 0) AS [+2], 
 
sum(case when diff >= 3 then 1 else 0) AS [>=+3] 
 
from 
 
(select Date, Num1, Num2, (Num1-Num2) diff from TableA)TableB 
 
group by Date

+0

В зависимости от того, как оптимизатор справится с этим, это может работать лучше, если вы агрегируете перед точкой опоры (т. Е. Гнездитесь на другом уровне). Как минимум, на самом деле вам не нужно вытягивать 'Num1' /' Num2' на следующий уровень. –

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