2017-06-26 7 views
0

Ich habe unter einer einzigen Tabelle mit 5 Zeilen und 4 Spalten, wollte ich das Ergebnis von 8 Spalten haben, versuchte eine innere beitreten auf der gleichen Tabelle, aber nicht das erwartete Ergebnis, ist da eine Möglichkeit, ausgewählte Datensätze aus der folgenden Abfrageergebnismenge zu erhalten?einzelne Tabelle vier Spalten in 8 Spalten

Declare @CustomerData Table (CustomerNum int, 
    VehicleName Char(20), 
    Vehiclepurchaseyear char(4), 
    Vehicleprice char(10)) 
INSERT INTO @CustomerData(CustomerNum,VehicleName,Vehiclepurchaseyear,Vehicleprice) 
VALUES (1000,'Toyoto Camry','2012',' 14500'), 
    (1000,'Nissan Ultima','2014','12000'), 
    (1500,'Honda Accord','2012','15000'), 
    (1500,'Honda Civic','2012','13000'), 
    (1800,'Toyoto RAV4','2012','16500') 
SELECT X.customerNum as CustomerNum 
    ,X.VehicleName as Vehiclename1 
    ,X.Vehiclepurchaseyear as vehiclepurchaseyear1 
    ,X.Vehicleprice  as vehicleprice1 
    ,Y.VehicleName as Vehiclename2 
    ,Y.Vehiclepurchaseyear as vehiclepurchaseyear2 
    ,Y.Vehicleprice  as vehicleprice2 
FROM 
    (SELECT CustomerNum, 
     VehicleName, 
     Vehiclepurchaseyear, 
     Vehicleprice 
    FROM @Customerdata) X 
INNER JOIN 
    (SELECT CustomerNum, 
     VehicleName, 
     Vehiclepurchaseyear, 
     Vehicleprice 
    FROM @CustomerData) Y 
on X.CustomerNum = Y.customernum  

Ergebnis nicht zu erwarten:

1000 Toyoto Camry   2012  14500  Toyoto Camry   2012  14500  
1000 Toyoto Camry   2012  14500  Nissan Ultima   2014 12000  
1000 Nissan Ultima   2014 12000  Toyoto Camry   2012  14500  
1000 Nissan Ultima   2014 12000  Nissan Ultima   2014 12000  
1500 Honda Accord   2012 15000  Honda Accord   2012 15000  
1500 Honda Accord   2012 15000  Honda Civic    2012 13000  
1500 Honda Civic    2012 13000  Honda Accord   2012 15000  
1500 Honda Civic    2012 13000  Honda Civic    2012 13000  
1800 Toyoto RAV4    2012 16500  Toyoto RAV4    2012 16500  

erwartetes Ergebnis:

1000 Toyoto Camry   2012  14500  Nissan Ultima   2014 12000 
1500 Honda Civic    2012  13000  Honda Accord   2012 15000 
1800 Toyoto RAV4    2012 
+0

Markieren Sie Ihre Frage mit der Datenbank, die Sie verwenden. –

+0

Formatieren Sie richtig. Es ist sehr schwer zu lesen. – Eric

Antwort

0

nur raten, aber dies scheint zu sein, was ich ist

SELECT cd.CustomerNum, 
     MAX(CASE WHEN Rn = 1 THEN cd.VehicleName END) AS VehicleName1, 
     MAX(CASE WHEN Rn = 1 THEN cd.VehiclePurchaseYear END) AS VehiclePurchaseYear1, 
     MAX(CASE WHEN Rn = 1 THEN cd.VehiclePrice END) AS VehiclePrice1, 
     MAX(CASE WHEN Rn = 2 THEN cd.VehicleName END) AS VehicleName2, 
     MAX(CASE WHEN Rn = 2 THEN cd.VehiclePurchaseYear END) AS VehiclePurchaseYear2, 
     MAX(CASE WHEN Rn = 2 THEN cd.VehiclePrice END) AS VehiclePrice2 
FROM (SELECT *, 
       ROW_NUMBER() OVER (PARTITION BY CustomerNum ORDER BY VehiclePurchaseYear) Rn 
     FROM @Customerdata) cd 
GROUP BY cd.CustomerNum 

dies will, um jeden Kunden des Kauf von Jahr sortieren und Ihnen das erste Ergebnis als Rn 1 und den zweiten Kauf als Rn geben 2.

es wird nicht zuverlässig sein, wenn 2 Autos im selben Jahr gekauft wurden, also möchten Sie vielleicht einen DateTime-Stempel hinzufügen, um es zu bestellen.

0

Dies werden Ihnen das gewünschte Ergebnis auf diesem kleinen Tisch, aber man sollte jede Zeile hat eine eindeutige ID machen und statt x.vehiclename <> y.veciclename zu sagen, würden Sie die UID verwenden.

Declare @CustomerData Table (CustomerNum int, 
           VehicleName Char(20), 
      Vehiclepurchaseyear char(4), 
      Vehicleprice char(10)) 
    INSERT INTO @CustomerData(CustomerNum,VehicleName,Vehiclepurchaseyear,Vehicleprice) 
    VALUES (1000,'Toyoto Camry','2012',' 14500'), 
      (1000,'Nissan Ultima','2014','12000'), 
      (1500,'Honda Accord','2012','15000'), 
      (1500,'Honda Civic','2012','13000'), 
      (1800,'Toyoto RAV4','2012','16500') 

    SELECT X.customerNum as CustomerNum 
     ,X.VehicleName as Vehiclename1 
     ,X.Vehiclepurchaseyear as vehiclepurchaseyear1 
     ,X.Vehicleprice  as vehicleprice1 
     ,Y.VehicleName as Vehiclename2 
     ,Y.Vehiclepurchaseyear as vehiclepurchaseyear2 
     ,Y.Vehicleprice  as vehicleprice2 
FROM 
(SELECT CustomerNum,VehicleName,Vehiclepurchaseyear,Vehicleprice 
from @Customerdata) X 
INNER JOIN 
(SELECT CustomerNum,VehicleName,Vehiclepurchaseyear,Vehicleprice 
from @CustomerData) Y 
on X.CustomerNum = Y.customernum 
and X.VehicleName<>Y.VehicleName 
Verwandte Themen