Подзапрос — случай, когда — подзапрос — группировка по количеству

#sql #db2

Вопрос:

Учитывая 2 таблицы, мне нужна сгруппированная сводка наград за покупки. Больше предметов означает больше наград.

корзина вкладок

ID Имя шоппинг_но Тип
001 Майк 00001 A
002 Майк 00001 A
003 Майк 00001 A
004 Том 00002 B
005 Том 00002 B
006 Тони 00003 A
007 Heinz 00004 A

tab_award

Товары награда тип_авард
1 0.05 A
2 0.50 A
3 0.90 A
4 1.00 A
1 0.15 B
2 0.70 B
3 1.10 B
4 1.30 B

В результате мне нужна следующая таблица.

награда Товары шоппинг_но тип _авард
0.90 3 00001 A
0.70 2 00002 B
0.05 1 00003 A
0.05 1 00004 A

Моя попытка решения. Я каждый раз получаю только null в качестве результата для награды (результат else) или ошибку «sql0811 результат выбора более одной строки». Я рад любой помощи, спасибо!

 SELECT          award,
                items,
                shopping_no,
                type_award
FROM            tab_basket t
LEFT OUTER JOIN tab_award u ON t.TYPE = u.type_award
                           AND CASE WHEN (SELECT COUNT(shopping_no)
                                            FROM tab_basket m
                                           WHERE t.id = m.id
                                             AND t.name = m.name
                                             AND t.shopping_no = m.shopping_no
                                             AND t.TYPE = u.TYPE
                                           GROUP BY shopping_no ) = '1' THEN '1'
                               case WHEN (SELECT COUNT(shopping_no)
                                            FROM tab_basket m
                                           WHERE t.id = m.id
                                             AND t.name = m.name
                                             AND t.shopping_no = m.shopping_no
                                             AND t.TYPE = u.TYPE
                                           GROUP BY shopping_no ) = '2' THEN '2' 
                               CASE WHEN (SELECT COUNT(shopping_no)
                                            FROM tab_basket m
                                           WHERE t.id = m.id
                                             AND t.name = m.name
                                             AND t.shopping_no = m.shopping_no
                                             AND t.TYPE = u.TYPE                                                                                                                  
                                           GROUP BY shopping_no ) = '3' THEN '3'
                               CASE WHEN (SELECT COUNT(shopping_no)
                                            FROM tab_basket m
                                           WHERE t.id = m.id
                                             AND t.name = m.name                                                                                                                   
                                             AND t.shopping_no = m.shopping_no                                                                                                                                 
                                             AND t.TYPE = u.TYPE                                                                                                                    
                                           GROUP BY shopping_no ) = '4' THEN '4'
                               ELSE 'no_price'                                                                                                   
                                END = u.award
 

Ответ №1:

Вы можете сначала объединить таблицу tab_basket, а затем объединить ее с таблицей tab_award —

 SELECT TB.award, TB.items, TA.shopping_no, TB.type_award
  FROM (SELECT name, shopping_no, type, COUNT(*) CNT
          FROM tab_basket
         GROUP BY name, shopping_no, type) TB
  JOIN tab_award TA ON TB.type = TA.type_award
                    AND TB.CNT = TA.items