获取值的逗号分隔的列表 - SQL
-----------------------------
| ProductId | ModelId |
|---------------------------|
| 12345 | A3666 |
| 12345 | A3667 |
| 12345 | A8999 |
| 12346 | A3666 |
| 12346 | A3667 |
-----------------------------
模式
-----------------------------
| ModelId | Name |
|---------------------------|
| A3666 | win |
| A3667 | xia |
| A8999 | vor |
-----------------------------
我试图得到的输出是这样的:
-----------------------------------
| ProductId | Models |
|---------------------------------|
| 12345 | win,xia,vor |
| 12346 | win,xia |
-----------------------------------
我代码是:
SELECT
p.ProductId,
STUFF
(
(
SELECT ',' + Name
FROM models m
WHERE m.ModelId=p.ModelId
ORDER BY Name
FOR XML PATH(''), type
).value('.', 'varchar(max)'), 1, 1, ''
) AS ModelNames
FROM
products p
这给O/P:
-----------------------------
| ProductId | ModelNames |
|---------------------------|
| 12345 | win |
| 12345 | xia |
| 12345 | vor |
| 12346 | win |
| 12346 | xia |
-----------------------------
我要去错在何处。 [我认为这个问题已经足够清楚了,但是它不会像提及的那样提交,而是添加更多的细节,主要是代码。因此本文。]
请用您的东西代替这段代码。 我真的在猜这个答案。
SELECT
Distinct
p.ProductId,
coalesce(models + ', ', '')
FROM
products p
--Other joins----
没有工作。它现在为每个产品提供所有名称。 – Qwerty 2014-11-05 06:58:05
@qwerty我编辑了答案 – 2014-11-05 07:02:56
我认为这应该可以解决您的问题。
SELECT DISTINCT
p.ProductId,
STUFF
(
(
SELECT ',' + m.Name
FROM models m
INNER JOIN products ip
ON m.ModelId = ip.ModelId
WHERE ip.ProductId = p.ProductId
ORDER BY p.ModelId
FOR XML PATH('')
), 1, 1, ''
) AS ModelNames
FROM products p
它重复了逗号分隔值 - 例如12345 - 赢,xia,vor,win,xia,vor – Qwerty 2014-11-05 11:18:09
我测试了你在我的SQL Server 2014上给定的设置,事情像预期的那样工作。你真正的设置工作有些不同吗? – Scoregraphic 2014-11-05 14:09:10
试试这个:
SELECT DISTINCT
p.ProductId,
STUFF
(
(
SELECT ',' + Name
FROM models m
WHERE m.ModelId IN (SELECT ModelId FROM products WHERE ProductId = p.ProductId)
ORDER BY Name
FOR XML PATH(''), type
).value('.', 'varchar(max)'), 1, 1, ''
) AS ModelNames
FROM
products p
它仍然是一样的,因为o/p我是geeting – Qwerty 2014-11-05 07:36:59
@Qwerty我已经在SSMS中测试了我的代码,它给了我这些记录作为输出:(12345 vor,win,xia),(12346 win,xia)。我真的不认为你的配置会出现什么问题。 – 2014-11-05 07:41:01
尝试用这个,这个输出相匹配您正在寻找
DECLARE @ProductModel AS Table(ProductId INT,ModelId Varchar(10))
INSERT INTO @ProductModel
VALUES(12345,'A3666'),
(12345,'A3667'),
(12345,'A8999'),
(12346,'A3666'),
(12346,'A3667')
DECLARE @Model AS Table(ModelId Varchar(10),Name Varchar(10))
Insert into @Model Values('A3666','win'),('A3667','xia'),('A8999','vor')
SELECT
p2.ProductId,
STUFF
(
(
SELECT ',' + Name
FROM @ProductModel p1
INNER JOIN @Model m ON m.ModelId=p1.ModelId
WHERE p1.ProductId=p2.ProductId
ORDER BY Name
FOR XML PATH(''), type
).value('.', 'varchar(max)'), 1, 1, ''
) AS ModelNames
FROM
@ProductModel p2
GROUP BY p2.ProductId
@Querty什么是你所面对的错误。 – 2014-11-05 06:44:33
没有错误。只是不是所需的o/p,如果你看到.. – Qwerty 2014-11-05 06:46:42
我不知道为什么人们如此痴迷于使用CSV传输数据进出SQL Server。 SQL Server至少有两种数据类型(表和xml),它们被设计为保存多个值。与你不得不编写各种奇数代码来构造它们的字符串(如这里)或者将它们分开以获取值一样。并丢失任何可能有用的数据类型检查。 – 2014-11-05 07:16:04