【问题标题】:How to split the column by identifier (|) and get the first item and group by?如何按标识符 (|) 拆分列并获取第一项和分组依据?
【发布时间】:2020-02-14 06:32:15
【问题描述】:

我有一个类别表,属性为

此 tag_id 是其父或子的序列或模式。

示例:

CREATE TABLE category (
    id int,
    parent_id int, 
    code varchar(255),
    name varchar(255).
    tag_id varchar(255)
);

INSERT INTO category (id, parent_id, code, name, tag_id)
VALUES
    (1,null,0,'category 1','|1|'),
    (2,null,1,'category 2','|2|'),
    (3,null,2,'category 3','|3|'),
    (4,null,3,'category 4','|4|'),
    (5,4,4,'category 5','|4|5|'),
    (6,5,5,'category 6','|4|5|6|');

如您所见,您可以确定该类别是否为父类别,如果 tag_id 内的第一个值是其 id。

我想按相同的第一个父 ID 按此类别分组

原因:我将此表连接到另一个表,其中有一个金额列,我想使用第一个父 ID 进行汇总和分组。

例如,我有一个销售表,其中它与产品表有关系。而且这个产品表和品类表有关系。

在销售表中,它有一列 total_amount 和 product_id。此 product_id 链接到产品表的 id。并且这个产品表有一个 category_id 列,该列链接到类别表的 id。

主要目标是获得销售第一级类别的总金额。我只需要如何拆分这个 |字符并只获取第一级类别

谢谢!

【问题讨论】:

  • 样本数据中的逗号在哪里?你的预期输出是什么?是否还涉及其他表,如果是,则还提供该表的 DDL 和示例数据。
  • @Star SQL Server 版本是多少?
  • 请用 CREATE TABLE 和 INSERT INTO 脚本替换您的结构和数据,并为显示的数据显示所需的结果。
  • 好吧。现在我们希望看到此数据的预期结果。 主要目标是获得销售第一级类别的 TOTAL_AMOUNT 总和。 源数据中没有名为 TOTAL_AMOUNT 的字段 - 无需总结。
  • @Star gotqn 询问您“SQL Server 版本是什么?” 40 分钟前。你忽略了这个问题——所以我决定你有最新的版本。您至少现在可以指定服务器的版本吗?只需执行select @@version; 并发布结果。

标签: sql sql-server split


【解决方案1】:

如果你需要标签的第一个不同的值,也不需要分组

    Select distinct id as tag_id from (SELECT SUBSTRING(s.tag_id,3,CHARINDEX('|',S.tag_id,3)-3) id from category s) temp

【讨论】:

  • 我不能子字符串,因为。 id 的长度不固定为 3 个字符。
  • @star 我已经更新了查询,它将考虑第一个 id 的长度。唯一需要考虑的是所有记录都以 [| 开头,所以我们是第 3 个字符的子字符串
  • 您的插入语句数据与前面显示的实际图像不同。请查找更新后的查询dbfiddle.uk/…
  • 谢谢先生。这个解决方案对我有用。我将您的解决方案更新为: SELECT SUBSTRING(s.tag_id,2,(CHARINDEX('|',S.tag_id,2))-2) id from category s 并获得预期结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
相关资源
最近更新 更多