2011-02-24 47 views
0

我有這樣的一個表:如何加入/拉平這些表

表名稱:產品

ID  PRODUCTID  PRODUCTNAME 
1  D100   Sample Product 
2  K500   Another sample product 

有相關的表看起來像這樣:

表名:COLORSIZE

ID  PRODUCTID  COLOR   S  M  L  XL 
1  D100   Red   S  M  L 
2  D100   Black   S  M  L 
3  D100   Blue   S  M  L 
4  K500   Green       L  XL 
4  K500   Red       L  XL 

一般規則是產品id始終具有相同的尺寸,只是顏色不同。所以如果一個D100紅色出現在S,M和L中,所有的D100只出現在S,M和L中。一個產品最多可以有20種顏色。

我需要編寫,將輸出以下

PRODUCTSWITHCOLORS SQL語句

ID  PRODUCT ID  PRODUCTNAME  COLOR1  COLOR2  COLOR3 S M L XL 
1  D100   Sample product Red  Black  Blue  S M L 
2  K500   Another sample Green  Red       L XL 

的「COLOR1」,「COLOR2」列需要要不要去「COLOR20」最大或他們需要只需結束最大數量的顏色(即,如果在查詢中,產品所具有的最大顏色數量是4,則可以在COLOR4處停止)。

這不是一個理想的方式來做到這一點,但它是被要求的報告。任何人都可以幫我寫一個SQL語句來完成這個任務嗎?

謝謝!

+0

請發佈您迄今爲止寫的代碼。人們通常不喜歡只爲你寫代碼。事實上,這是一個工作描述,而不是一個問題。 – 2011-02-24 00:43:07

+0

我沒有代碼......我不知道如何將第二張桌子弄平,這就是我要問的原因。 – Scott 2011-02-24 00:44:11

回答

6

如果您使用的是2005/2008版本的sql server,則可以使用PIVOT。 爲了停止最大數量的顏色,您可以動態構建此查詢。 這裏有一些幫助:

;WITH ProductColor as(
select a.ProductId, 
     b.ProductName, 
     a.Color, 
     RANK() over (partition by ProductName order by a.Id) r 
from dbo.COLORSIZE a left join 
     dbo.PRODUCT b on a.PRODUCTID=b.PRODUCTID 
) 
SELECT ProductId,ProductName,[1], [2], [3] 
FROM 
(select ProductId,ProductName,Color,r 
from ProductColor) p 
PIVOT 
(
MIN (Color) 
FOR r IN 
([1], [2], [3]) 
) AS pvt; 
+0

太棒了,謝謝你的幫助。 – Scott 2011-02-24 01:59:19

0

這將帶您起步..

你將需要做SubQuerys但問題是,你想做一個表取決於你有顏色的數量較大。

您的模式並不適用。

SELECT 
    A.ID 
    ,B.PRODUCTID 
    ,B.PRODUCTNAME 
    ,B.COLOR1 
    ,B.COLOR2 
    ,B.COLOR3 
    ,B.S 
    ,B.M 
    ,B.L 
FROM 
    PRODUCT A 
    INNER JOIN 
     COLORSIZE B 
       ON A.ProductID = B.ProductID 
+0

表B(COLORSIZE)沒有COLOR1,COLOR2,COLOR3列等,它們都存在於不同的行中。 – Scott 2011-02-24 00:54:10