【问题标题】:Subquery - case when - subselect - group by - count子查询 - case when - subselect - group by - count
【发布时间】:2021-12-22 07:00:17
【问题描述】:

给定 2 张桌子,我需要一个购物奖励的分组摘要。更多的项目意味着更多的奖励。

tab_basket

id name shopping_no type
001 Mike 00001 A
002 Mike 00001 A
003 Mike 00001 A
004 Tom 00002 B
005 Tom 00002 B
006 Tony 00003 A
007 Heinz 00004 A

tab_award

items award type_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

我需要下表作为结果。

award items shopping_no type _award
0.90 3 00001 A
0.70 2 00002 B
0.05 1 00003 A
0.05 1 00004 A

我的解决方案尝试。我每次只得到 null 作为奖励的结果(else 结果)或错误“sql0811 result of select more one row”。 我很乐意为您提供任何帮助,谢谢!

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

【问题讨论】:

    标签: sql db2


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-15
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      相关资源
      最近更新 更多