2017-08-14 62 views
0

給定一個下表使列值的基礎上,記錄的組合:使用SQL

**Title** | **Value** 
Color | Red 
Color | Green 
Color | Blue 
Size  | Small 
Size  | Medium 
Size  | Large 

現在我想進行有關顏色和尺寸的所有可能的組合。

輸出應該是這個樣子:

**Size** | **Color** 
Small | Red 
Small | Green 
Small | Blue 
Medium | Red 
Medium | Green 
Medium | Blue 
Large | Red 
Large | Green 
Large | Blue 

所以,有9個可能的組合(變化)的顏色和大小屬性

這是如何實現的SQL Server數據庫

回答

0

你可以拿你的表的跨自連接,限制一面是唯一的顏色記錄和另外一側只有大小記錄。

SELECT 
    t2.Value, 
    t1.Value 
FROM yourTable t1 
CROSS JOIN yourTable t2 
WHERE 
    t1.Title = 'Color' AND 
    t2.Title = 'Size' 
ORDER BY 
    CASE WHEN t2.Value = 'Small' THEN 1 
     WHEN t2.Value = 'Medium' THEN 2 
     WHEN t2.Value = 'Large' THEN 3 END, 
    CASE WHEN t1.Value = 'Red' THEN 1 
     WHEN t1.Value = 'Green' THEN 2 
     WHEN t1.Value = 'Blue' THEN 3 END; 

請注意,您可以省略冗長ORDER BY條款,如果你並不真的需要在你向我們展示了爲了呈現您的數據。例如,如果您的應用程序或表示層使用此數據,那麼對其進行排序可能無關緊要。

輸出:

enter image description here

演示在這裏:

Rextester

+0

謝謝@Tim Biegeleisen – Hamza

+0

如果有動態屬性值,請你幫我解決嗎?我的意思是顏色,大小,風格等......這些屬性可以是動態的,我甚至不知道它會有多少... – Hamza

+0

@Hamza我支持戈登的評論100%。如果你有一個完全不同的問題,然後問一個新的問題。堆棧溢出不是一個博客網站,其中的問題變形和拖曳。事實上,該網站的創建是爲了避免這一點。 –

0

你可以使用cross join

select s.size, c.color 
from (select value as size from t where title = 'size') s cross join 
    (select value as color from t where title = 'color') c; 

Actu盟友,你不需要的子查詢:

select ts.value as size, tc.value as color 
from t ts cross join 
    t tc 
where ts.title = 'size' and tc.title = 'color'; 
+0

我有尺寸的長期動態屬性,顏色,重量等......每個屬性都有它的我在問題中提到過的動態值。那麼,你能否更詳細地說明這個動態結構中的 – Hamza

+0

@Hamza Gordon的查詢(和我的)應該可以處理任意數量的大小和顏色,只要它們不重複出現。 –

+1

@Hamza。 。 。這不是你問的問題(「現在我想製作與顏色和尺寸相關的所有可能的組合」)。如果你有另外一個問題,那就把它作爲另一個問題。這個問題似乎已經得到了解答(如果你改變了這個問題,你會使答案變得無效,這些答案會對試圖幫助你的人提起低估)。 –