【问题标题】:Denormalize into pipe separated list [duplicate]非规范化为管道分隔列表[重复]
【发布时间】:2012-08-17 17:03:39
【问题描述】:

可能重复:
Is there a way to create a SQL Server function to “join” multiple rows from a subquery into a single delimited field?

我有一个这样的表:

客户定制 ------------ 一个 1 b 2 b 3 c 4 c 5 c 6

我想把上面的反规范化成下面的形式

客户定制 --------------- 一个 1 b 2|3 c 4|5|6

请注意,acc 列现在应包含任何客户的以竖线分隔的帐户列表。此外,一个客户可能拥有的帐户数量也是可变的。

如何使用 SQL 做到这一点?

【问题讨论】:

  • 哪个数据库?我的 sql 还是 sql server?
  • 您使用哪些 rdbms? MySQL、Oracle、MSSQL、...?
  • 我正在使用 SQL Server 来执行此操作

标签: sql sql-server


【解决方案1】:

试试这个:

SELECT cust, acc = 
    STUFF((SELECT '| ' +CAST( acc as varchar(20))
           FROM <table> b 
           WHERE b.cust = a.cust 
          FOR XML PATH('')), 1, 2, '')
FROM <table> a
GROUP BY cust


SQL Fiddle Demo

【讨论】:

  • 我在修改后让它工作,但管道分隔的列表正在写入文件,并且答案集中提供了链接。我正在使用 teradata sql 助手在 sql server 数据库上运行查询。任何想法如何阻止这种行为并强制管道分隔列表显示在答案集中?
【解决方案2】:

如果您想按 Cust 进行分组(类似于 MySQL 中的 Group_Concate),SQL Server 中没有任何方法。 所以试试这个:

SELECT * FROM (
        SELECT  DISTINCT cust
        FROM    t
        ) table2
    CROSS APPLY
        (SELECT  CASE ROW_NUMBER() 
          OVER(ORDER BY acc) 
          WHEN 1 THEN '' ELSE ' | ' END + 
          (cast(acc as varchar))
        FROM    t table3
        WHERE   table3.cust = table2.cust
        ORDER BY acc
        FOR XML PATH ('')
        ) table3(acc)

See this SQLFiddle

另见:Group columns into multiple rows and Group_concate like MySQL in SQL Server

【讨论】:

  • 我在修改后让它工作,但管道分隔的列表正在写入文件中,并且答案集中提供了链接。我正在使用 teradata sql 助手在 sql server 数据库上运行查询。任何想法如何阻止这种行为并强制管道分隔列表显示在答案集中?
【解决方案3】:

试试这个:

 select cust,
STUFF((select '|'+cast(acc as varchar) from c1 where c1.cust = c2.cust for XML   path('')),1,1,'') as acc from c1 c2
group by cust 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-02
    • 2018-10-18
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多