2017-07-21 4 views
2

Ich habe eine Liste von Elementen in einer Tabelle. Diese Gegenstände könnten zwei Typen ‚A‘ oder ‚M‘Abfrage zum Zusammenführen von 3 Tabellen SQL SERVER

Tabelle 1

--------------------------------------------------------- 
| Code | Type | Description | Quantity | Cost | 
|-------------------------------------------------------| 
|BAG001_M| M | Some text here|  2.0 | 40.0 | 
|BAG002_M| M | Some text here|  5.0 | 69.0 | 
|CAY003_M| A | Some text here|  8.0 | 10.0 | 
|CFI002_M| M | Some text here|  8.0 | 10.0 | 
-------------------------------------------------------- 

Ich brauche eine andere Spalte haben, die Maßeinheit (UoM) zu zeigen. Diese Spalte befindet sich in zwei verschiedenen Tabellen. Wenn ein Artikel Typ M die UoM in Tabelle A befindet, in der anderen Seite, wenn es ein Typ der UoM in Tabelle B befindet

Tabelle A

----------------------------------------------- 
| Code | Description | Currency | UoM | 
|---------------------------------------------- 
|BAG001_M| Some text here|  MXN | m2 | 
|BAG002_M| Some text here|  USD | lt | 
|CFI002_M| Some text here|  MXN | m3 | 
----------------------------------------------- 

Tabelle B

----------------------------------------------- 
| Code | Description | Currency | UoM | 
|---------------------------------------------- 
|CAY003_M| Some text here|  USD | kg | 
----------------------------------------------- 

Ich muss so etwas haben.

----------------------------------------------------------------- 
| Code | Type | Description | Quantity | Cost | UoM | 
|---------------------------------------------------------------| 
|BAG001_M| M | Some text here|  2.0 | 40.0 | m2 | 
|BAG002_M| M | Some text here|  5.0 | 69.0 | lt | 
|CAY003_M| A | Some text here|  8.0 | 10.0 | kg | 
|CFI002_M| M | Some text here|  8.0 | 10.0 | m3 | 
----------------------------------------------------------------- 

Es gibt ein kleines Problem. Es könnte zwei Einträge mit dem gleichen Code aber einem anderen Typ geben, sodass sie möglicherweise eine andere ME haben. Beispielsweise.

----------------------------------------------------------------- 
| Code | Type | Description | Quantity | Cost | UoM | 
|---------------------------------------------------------------| 
|AAA001_M| M | Some text here|  2.0 | 40.0 | m2 | 
|AAA001_M| A | Some text here|  5.0 | 20.0 | lt | 
----------------------------------------------------------------- 

Ich benutze SQL Server 2012 und habe den folgenden Code ausprobiert. Es hat mit dem ersten inneren Join funktioniert, also habe ich versucht, einen anderen hinzuzufügen, aber es scheint, dass dies nicht die Art ist, es zu tun.

SELECT 
    CODE 
    ,Type 
    ,AD.DESCRIPTION 
    ,QUANTITY 
    ,AD.[COSTS] 
    ,A.UOM 
FROM 
    Table1 AS AD INNER JOIN TableA AS A 
ON 
    CODE = CASE 
         WHEN Type = 'M' 
          THEN A.CODE 
        END 
    INNER JOIN TableB AS B 
ON 
    Code = CASE 
          WHEN Type = 'A' 
           THEN B.CODE 
         END 

Kann mir hier jemand helfen?

Antwort

0

Hier ist eine Möglichkeit, dies mit zwei Left Join s zu tun:

Select  AD.CODE, 
      AD.Type, 
      AD.DESCRIPTION, 
      AD.QUANTITY, 
      AD.[COSTS], 
      Coalesce(A.UOM, B.UOM) As UOM 
From  Table1 AD 
Left Join TableA A On A.Code = AD.Code 
         And AD.Code = 'M' 
Left Join TableB B On B.Code = AD.Code 
         And AD.Code = 'A' 

Die Coalesce() wird den ersten nicht-NULL Wert aus den beiden Ergebnissen auszuwählen.


In dem Fall, dass ein Element beide Ergebnisse mehrere Codes und Sie brauchen, können Sie eine UNION ALL statt:

Select AD.CODE, 
     AD.Type, 
     AD.DESCRIPTION, 
     AD.QUANTITY, 
     AD.[COSTS], 
     A.UOM 
From Table1 AD 
Join TableA A On A.Code = AD.Code 
Where AD.Code = 'M' 
Union All 
Select AD.CODE, 
     AD.Type, 
     AD.DESCRIPTION, 
     AD.QUANTITY, 
     AD.[COSTS], 
     B.UOM 
From Table1 AD 
Join TableB B On B.Code = AD.Code 
Where AD.Code = 'A' 
+0

Es funktionierte perfekt. Vielen Dank! –