2017-11-25 274 views
0

我有5臺變型,細節如下:如何以特定方式顯示錶格中的變體記錄?

產品表:

ProductID Name 
    12 T-Shirt 

變異表:

VariantID ProductID Name 
    1   12  Size 
    2   12  Color 
    3   12  Material 

VariantOption表:

VariantOptionID VariantID VariantOptionName 
     1    1   Small 
     2    1   Medium 
     3    2   Red 
     4    2   Blue 
     5    3   Cotton 
     6    3   Lawn 

SKU表:

SkuID ProductID SKU    Price Barcode 
    1  12  Th-Sm-Red-Cot 120.00 345423 
    2  12  Th-Sm-Red-Lon 130.00 345454 
    3  12  Th-Sm-Blue-Cot 140.00 345451 
    4  12  Th-Sm-Blue-Lon 150.00 345431 
    5  12  Th-Md-Red-Cot 160.00 345472 
    6  12  Th-Md-Red-Lon 170.00 345479 
    7  12  Th-Md-Blue-Cot 180.00 654353 
    8  12  Th-Md-Blue-Lon 190.00 254353 

VariantOptionCombination表:

VariantOptionID SkuID 
     1   1 
     3   1 
     5   1 
     1   2 
     3   2 
     6   2 
     1   3 
     4   3 
     5   3 
     1   4 
     4   4 
     6   4 

我想表明的網頁,這些表中的記錄。 請指導我怎樣才能實現這種方式來檢索記錄:

Size Color Material Price Sku 
Small Red Cotton 120.00 345423 
Small Red Lawn  130.00 345454 
Small Blue Cotton 140.00 345451 
Small Blue Lawn  150.00 345431 
Medium Red Cotton 160.00 345472 
Medium Red Lawn  170.00 345479 
Medium Blue Cotton 180.00 654353 
Medium Blue Lawn  190.00 254353 
+0

它是MySQL或SQL服務器? – Sami

+0

我正在使用Sql服務器。 – Ahmed

+0

我想你已經嘗試了一些東西。你可以發佈你的SQL,以便我們可以幫助糾正嗎? – Ramesh

回答

1

您可以使用joinpivot實現你想要的結果。

select Material,Color,Size,Price, barcode from 
(
select v.Name, vo.VariantOptionName, s.barcode, s.Price 
from sku s 
join VariantOptionCombination voc 
on s.SkuID = voc.SkuID 
join VariantOption vo 
on vo.VariantOptionID = voc.VariantOptionID 
join Variant v 
on v.VariantID = vo.VariantID 
) as t1 
pivot 
( max(VariantOptionName) 
    for Name in (Size, Color, Material) 
) as t2; 

這裏的想法是考慮sku作爲主表和使用join獲得VariantOptionName從表VariantOptionName從表Variant表,然後再使用pivotName到行轉換爲列。

結果:

+----------+--------+--------+--------+---------+ 
| Material | Color | Size | Price | barcode | 
+----------+--------+--------+--------+---------+ 
| Cotton | Red | Small | 120,00 | 345423 | 
| Lawn  | Blue | Small | 150,00 | 345431 | 
| Cotton | Blue | Small | 140,00 | 345451 | 
| Lawn  | Red | Small | 130,00 | 345454 | 
+----------+--------+--------+--------+---------+ 

Pivot DEMO


更新:

如果你不想使用pivot,你可以使用條件的聚集。

select max(case when v.Name = 'Size' then vo.VariantOptionName end) as Size, 
     max(case when v.Name = 'Color' then vo.VariantOptionName end) as Color, 
     max(case when v.Name = 'Material' then vo.VariantOptionName end) as Material, 
     s.price, 
     s.barcode  
from sku s 
join VariantOptionCombination voc 
on s.SkuID = voc.SkuID 
join VariantOption vo 
on vo.VariantOptionID = voc.VariantOptionID 
join Variant v 
on v.VariantID = vo.VariantID 
group by s.barcode, s.Price; 

Aggregation DEMO

+0

我可以在不使用支點的情況下實現相同的功能嗎? – Ahmed

+0

@艾哈邁德:是的,你可以。請檢查更新後的答案。 – zarruq

+0

你的意見是我的數據庫設計是對的?或者我可以改善這一點? – Ahmed