2014-11-05 56 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