0

Ich habe 5 Tabellen von Varianten, Details unter:Wie wird der Datensatz "Variants" aus Tabellen in einer bestimmten Weise angezeigt?

Produkttabelle:

ProductID Name 
    12 T-Shirt 

Variant Tabelle:

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

VariantOption Tabelle:

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

Sku Tabelle:

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 Tabelle:

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 

Ich möchte diese Tabellen Einträge in Web-Seite zeigen. Bitte leite mich, wie kann ich Aufzeichnung auf diese Weise abzurufen erreichen:

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

Ist es MySQL oder SQL Server? – Sami

+0

Ich benutze Sql Server. – Ahmed

+0

Ich denke du hast schon etwas ausprobiert. Können Sie Ihren SQL-Code posten, damit wir Ihnen bei der Korrektur helfen können? – Ramesh

Antwort

1

Sie können join und pivot Ihre gewünschte Ergebnis zu erzielen.

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; 

Die Idee hier ist sku als Haupttabelle zu betrachten und join verwenden VariantOptionName aus Tabelle Variant Tabelle VariantOption und Name aus der Tabelle zuerst zu bekommen und dann pivot auf Name mit Zeilen in Spalten zu transformieren.

Ergebnis:

+----------+--------+--------+--------+---------+ 
| 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


Update:

Wenn Sie nicht verwenden pivot möchten, können Sie bedingte Aggregation verwenden.

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

Kann ich dasselbe ohne Pivot erreichen? – Ahmed

+0

@Ahmed: Ja, du kannst. Bitte überprüfen Sie die aktualisierte Antwort. – zarruq

+0

Was ist Ihre Meinung ist meine Datenbank-Design ist richtig? Oder kann ich das verbessern? – Ahmed

Verwandte Themen