2017-11-25 191 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