我有一个这样的表:
客户定制 ------------ 一个 1 b 2 b 3 c 4 c 5 c 6
我想将上面的非规范化为以下形式
客户定制 --------------- 一个 1 b 2|3 c 4|5|6
请注意,acc 列现在应该包含任何客户的以竖线分隔的帐户列表。此外,客户的可能帐户数量也可以是可变的。
如何使用 SQL 做到这一点?
我有一个这样的表:
客户定制 ------------ 一个 1 b 2 b 3 c 4 c 5 c 6
我想将上面的非规范化为以下形式
客户定制 --------------- 一个 1 b 2|3 c 4|5|6
请注意,acc 列现在应该包含任何客户的以竖线分隔的帐户列表。此外,客户的可能帐户数量也可以是可变的。
如何使用 SQL 做到这一点?
试试这个:
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
如果您想按 Cust 分组(类似于Group_Concate
MySQL),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)
另见:Group columns into multiple rows and Group_concate like MySQL in SQL Server
试试这个:
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