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

如何根据发票日期、发票编号及类别生成新类别?

问题解决:生成符合规则的新类别字段

原数据表格

日期发票编号类别
30-09-20241VSS
1-10-20242RSS
1-10-20243VSS
1-10-20243RSS
1-10-20244RSS
1-10-20244RSS

目标结果表格

日期发票编号类别新类别
30-09-20241VSSVSS
1-10-20242RSSRSS
1-10-20243VSSVSS
1-10-20243RSSVSS
1-10-20244RSSRSS
1-10-20244RSSRSS

规则说明

  • 同一日期+发票编号组合下存在不同类别时,该组合所有记录的新类别统一为VSS
  • 同一日期+发票编号组合下类别唯一时,新类别保留原类别

你尝试的错误SQL

SELECT Date, BillNo, Category 
    , case when [Category]='VSS' then 'VSS' else 'RSS' end [New CATEGORY] 
FROM TBL

该SQL仅判断当前行的类别,未考虑同一分组内的其他行数据,因此无法满足需求。

正确的SQL实现

方法1:使用窗口函数(推荐)

通过窗口函数统计每个分组内的不同类别数量,再据此判断新类别:

SELECT 
    Date,
    BillNo,
    Category,
    CASE 
        WHEN COUNT(DISTINCT Category) OVER (PARTITION BY Date, BillNo) > 1 THEN 'VSS'
        ELSE Category
    END AS [New CATEGORY]
FROM TBL
  • PARTITION BY Date, BillNo:按日期和发票编号分组,将同一日期同一发票的记录归为一组
  • COUNT(DISTINCT Category) OVER (...):统计每组内不同类别的数量
  • 数量大于1时说明分组内存在多类别,新类别设为VSS;否则直接使用原类别

方法2:子查询关联(兼容不支持窗口函数DISTINCT的场景)

先通过子查询统计每个分组的类别数量,再关联原表生成结果:

SELECT 
    t.Date,
    t.BillNo,
    t.Category,
    CASE 
        WHEN c.CategoryCount > 1 THEN 'VSS'
        ELSE t.Category
    END AS [New CATEGORY]
FROM TBL t
JOIN (
    SELECT Date, BillNo, COUNT(DISTINCT Category) AS CategoryCount
    FROM TBL
    GROUP BY Date, BillNo
) c ON t.Date = c.Date AND t.BillNo = c.BillNo

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:19:52