Sql 如何以特定的方式显示表中的变量记录?
我有5个变体表,详情如下: 产品表:Sql 如何以特定的方式显示表中的变量记录?,sql,sql-server,asp.net-mvc,entity-framework,database-design,Sql,Sql Server,Asp.net Mvc,Entity Framework,Database Design,我有5个变体表,详情如下: 产品表: ProductID Name 12 T-Shirt 变量表: VariantID ProductID Name 1 12 Size 2 12 Color 3 12 Material 差异表: VariantOptionID VariantID VariantOptionName 1 1
ProductID Name
12 T-Shirt
变量表:
VariantID ProductID Name
1 12 Size
2 12 Color
3 12 Material
差异表:
VariantOptionID VariantID VariantOptionName
1 1 Small
2 1 Medium
3 2 Red
4 2 Blue
5 3 Cotton
6 3 Lawn
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
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
变量组合表:
VariantOptionID VariantID VariantOptionName
1 1 Small
2 1 Medium
3 2 Red
4 2 Blue
5 3 Cotton
6 3 Lawn
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 <代码>为主表,使用<代码>连接< /代码>从表<代码> ValuestOptudio和<代码> > <代码> >从表<代码>变体< /代码>表开始,然后使用<代码> PIVOT <代码> >代码>名称>代码>将行转换为列。
结果:+----------+--------+--------+--------+---------+
| 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 |
+----------+--------+--------+--------+---------+
更新:
+----------+--------+--------+--------+---------+
| 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 |
+----------+--------+--------+--------+---------+
如果不想使用透视,可以使用条件聚合
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 Server?我正在使用SQL Server。我想你已经试过了。你能发布你的SQL以便我们能帮助纠正吗?我能在不使用pivot的情况下实现同样的效果吗?@Ahmed:是的,你能。请检查更新的答案。你认为我的数据库设计是正确的吗?或者我可以改进它?@Ahmad:设计似乎还可以。但是,您可以问另一个关于当前设计的问题。我希望有人能详细调查一下:-)谢谢扎鲁克的帮助。