2014-11-05 32 views
0

产品获取值的逗号分隔的列表 - 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   | 
----------------------------- 

我要去错在何处。 [我认为这个问题已经足够清楚了,但是它不会像提及的那样提交,而是添加更多的细节,主要是代码。因此本文。]

+0

@Querty什么是你所面对的错误。 – 2014-11-05 06:44:33

+0

没有错误。只是不是所需的o/p,如果你看到.. – Qwerty 2014-11-05 06:46:42

+1

我不知道为什么人们如此痴迷于使用CSV传输数据进出SQL Server。 SQL Server至少有两种数据类型(表和xml),它们被设计为保存多个值。与你不得不编写各种奇数代码来构造它们的字符串(如这里)或者将它们分开以获取值一样。并丢失任何可能有用的数据类型检查。 – 2014-11-05 07:16:04

回答

0

请用您的东西代替这段代码。 我真的在猜这个答案。

SELECT 
    Distinct 
    p.ProductId, 
    coalesce(models + ', ', '') 
FROM 
    products p 
    --Other joins---- 
+0

没有工作。它现在为每个产品提供所有名称。 – Qwerty 2014-11-05 06:58:05

+0

@qwerty我编辑了答案 – 2014-11-05 07:02:56

1

我认为这应该可以解决您的问题。

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 
+0

它重复了逗号分隔值 - 例如12345 - 赢,xia,vor,win,xia,vor – Qwerty 2014-11-05 11:18:09

+0

我测试了你在我的SQL Server 2014上给定的设置,事情像预期的那样工作。你真正的设置工作有些不同吗? – Scoregraphic 2014-11-05 14:09:10

1

试试这个:

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 
+0

它仍然是一样的,因为o/p我是geeting – Qwerty 2014-11-05 07:36:59

+0

@Qwerty我已经在SSMS中测试了我的代码,它给了我这些记录作为输出:(12345 vor,win,xia),(12346 win,xia)。我真的不认为你的配置会出现什么问题。 – 2014-11-05 07:41:01

1

尝试用这个,这个输出相匹配您正在寻找

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