Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何以特定的方式显示表中的变量记录?_Sql_Sql Server_Asp.net Mvc_Entity Framework_Database Design - Fatal编程技术网

Sql 如何以特定的方式显示表中的变量记录?

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

我有5个变体表,详情如下:

产品表:

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:设计似乎还可以。但是,您可以问另一个关于当前设计的问题。我希望有人能详细调查一下:-)谢谢扎鲁克的帮助。