如何以特定方式显示表格中的变体记录?
问题描述:
我有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
答
您可以使用join
和pivot
实现你想要的结果。
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
从表VariantOption
和Name
从表Variant
表,然后再使用pivot
上Name
到行转换为列。
结果:
+----------+--------+--------+--------+---------+
| 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
,你可以使用条件的聚集。
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;
它是MySQL或SQL服务器? – Sami
我正在使用Sql服务器。 – Ahmed
我想你已经尝试了一些东西。你可以发布你的SQL,以便我们可以帮助纠正吗? – Ramesh