Предложение SQL GROUP BY не создает отдельных строк - PullRequest
1 голос
/ 17 января 2012

У меня есть две таблицы:

  • t1 (date d, name c(20), debit n(7), credit n(7))
  • t2 (date d, name c(20), type c(25), obal n(7))

Вот пример данных.

T1:

DATE        NAME        DEBIT   CREDIT
01.01.12    dad                 5000
01.01.12    mum                 6000
05.01.12    school      1000    
01.02.12    dad                 5000
01.02.12    mum                 6000
10.02.12    tuition     300 
10.02.12    snacks      100 
01.03.12    dad                 5000
01.03.12    mum                 6000
01.03.12    books       500 
02.03.12    rice        500 
02.03.12    vegetables  900 
03.03.12    snacks      100 
01.04.12    dad                 5000
01.04.12    mum                 6000
01.04.12    meat        200 
21.04.12    guest       800 

Т2:

DATE        NAME        TYPE        OBAL
01.01.12    dr fee      medical     8000
01.01.12    medicine    medical     -10000
01.01.12    dad         income      400000
01.01.12    mum         income      450000
05.01.12    school      education   0
10.02.12    tuition     education   0
10.02.12    snacks      misc        0
01.03.12    books       education   0
02.03.12    rice        food        0
02.03.12    vegetables  food        0
01.04.12    meat        food        0
21.04.12    guest       misc        0

Ожидается сумма (obal + credit - debit) для каждого имени, сгруппированного по типу (t2). Используемый запрос и полученный результат:

SELECT 
    t2.type, obal + SUM(NVL(credit - debit, 0)) as bal 
FROM t2 
LEFT JOIN t1 ON t2.name = t1.name 
GROUP BY 
    t2.type, t2.obal

Результаты:

TYPE        BAL
education   -1800
food        -1600
income      420000
income      474000
medical     -10000
medical     8000
misc        -1000

У меня такой вопрос: почему type income и medical появляются дважды в выводе запроса, несмотря на использование предложения GROUP BY? Я попытался добавить предложение DISTINCT перед столбцом t2.type , и это тоже выдает тот же результат! Я мог бы заметить, что две записи типа medical в таблице t2 не имеют записей в t1 , совпадающих с одинаковым именем и две записи типа типа income имеют ненулевое значение obal в t2 . Пожалуйста, помогите мне преодолеть эту проблему.

Ответы [ 4 ]

2 голосов
/ 17 января 2012

У вас есть два столбца группировки: ....

GROUP BY t2.type, t2.obal

База данных группирует значения по различным комбинациям обоих значений!

2 голосов
/ 17 января 2012

Вы GROUP используете различные комбинации из type, obal.

Если вы группируете только по type, у вас не будет дублирующихся записей для каждого типа, но вынужно будет решить, как обработать поле obal.

1 голос
/ 17 января 2012

Проблема в том, что вы группируете не только по type, но и по obal.

Попытка:

select type,sum(bal) as bal
from(
  SELECT t2.type, obal + SUM(NVL(credit - debit, 0)) as bal FROM t2 LEFT JOIN t1 ;
  ON t2.name = t1.name GROUP BY t2.type, t2.obal
)a
group by type;
0 голосов
/ 17 января 2012

удалите t2.obal из вашей группы по предложению.

SELECT t2.type, SUM(NVL(credit - debit, 0), obal) as bal 
FROM t2 LEFT JOIN t1 ON t2.name = t1.name 
GROUP BY t2.type
...