You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL交易表按带售价的组合表头分组子项的实现问询

组合菜单表头与子项的分组实现方案

可以实现,以下是针对两种分组需求的SQL实现(假设你的交易表名为transaction_table):

原交易表结构

Lineitem |  ItemCode  | Item Desc               | sale price |
 1       |   CB1      |     COMBO HEADER MENU1  |  5000      |
 2       |   100      |     Item A              |     0      |
 3       |   101      |     Item B              |     0      |
 4       |   CB2      |     COMBO HEADER MENU2  | 10000      |
 5       |   102      |     Item C              |     0      |

一、生成数字序号分组(对应期望结果1)

通过累计组合表头的数量,为每组分配递增的数字序号:

WITH combo_groups AS (
    SELECT 
        Lineitem,
        ItemCode,
        "Item Desc" AS ItemDesc,
        -- 累计组合表头的数量,形成分组序号
        SUM(CASE WHEN ItemCode LIKE 'CB%' THEN 1 ELSE 0 END) OVER (ORDER BY Lineitem) AS group_id
    FROM transaction_table
)
SELECT 
    ItemCode,
    ItemDesc,
    group_id AS "Group"
FROM combo_groups
ORDER BY Lineitem;

执行后结果:

ItemCode   |    Item Desc           | Group |
 CB1       | COMBO HEADER MENU1     | 1     |
 100       | Item A                 | 1     |
 101       | Item B                 | 1     |
 CB2       | COMBO HEADER MENU2     | 2     |
 102       | Item C                 | 2     |

二、生成组合表头ItemCode作为分组(对应期望结果2)

使用窗口函数获取最近的组合表头ItemCode,向下填充作为分组标识:

WITH combo_groups AS (
    SELECT 
        Lineitem,
        ItemCode,
        "Item Desc" AS ItemDesc,
        -- 取当前行及之前最近的组合表头ItemCode
        LAST_VALUE(CASE WHEN ItemCode LIKE 'CB%' THEN ItemCode ELSE NULL END) 
            OVER (ORDER BY Lineitem ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS group_code
    FROM transaction_table
)
SELECT 
    ItemCode,
    ItemDesc,
    group_code AS "Group"
FROM combo_groups
ORDER BY Lineitem;

执行后结果:

ItemCode   |    Item Desc           | Group   |
 CB1       | COMBO HEADER MENU1     | CB1     |
 100       | Item A                 | CB1     |
 101       | Item B                 | CB1     |
 CB2       | COMBO HEADER MENU2     | CB2     |
 102       | Item C                 | CB2     |

兼容旧版本SQL方言的备选方案

如果你的数据库不支持LAST_VALUE,可以先生成数字分组ID,再关联组合表头的ItemCode:

WITH combo_headers AS (
    SELECT 
        SUM(CASE WHEN ItemCode LIKE 'CB%' THEN 1 ELSE 0 END) OVER (ORDER BY Lineitem) AS group_id,
        ItemCode
    FROM transaction_table
    WHERE ItemCode LIKE 'CB%'
),
all_rows AS (
    SELECT 
        Lineitem,
        ItemCode,
        "Item Desc" AS ItemDesc,
        SUM(CASE WHEN ItemCode LIKE 'CB%' THEN 1 ELSE 0 END) OVER (ORDER BY Lineitem) AS group_id
    FROM transaction_table
)
SELECT 
    a.ItemCode,
    a.ItemDesc,
    c.ItemCode AS "Group"
FROM all_rows a
JOIN combo_headers c ON a.group_id = c.group_id
ORDER BY a.Lineitem;

内容的提问来源于stack exchange,提问作者Andreana Carli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 09:33:20