2 Stimmen

SELECT eine Spalte zweimal aus derselben Tabelle mit zwei WHERE-Bedingungen SQL SERVER

Ich versuche herauszufinden, wie man auf einfachste Weise eine Spalte aus derselben Tabelle zweimal auswählt, aber sie mit zwei verschiedenen WHERE-Bedingungen nebeneinander zeigt, als Teil einer größeren Abfrage (siehe unten). Wie kann dies am besten erreicht werden?

USE PDX_SAP_USER 

GO 

SELECT          P.PLANT_CODE,
                P.STOCK_CATEGORY,
                P.MATERIAL,
                P.DISTRIBUTION_VERSION_CODE,
                P.PERIOD_CODE,
                P.REQUIREMENTS_DATE,
                P.PLANNED_QTY AS 'REM PLAN QTY',
                P.VERSION_IND_FLAG,
                P.SIZE_LITERAL,
                P.WITHDRAWN_QUANTITY,
                P.TECHNICAL_INDEX,
                P.PLANNED_QTY + P.WITHDRAWN_QUANTITY AS 'ORIGINAL FCST QTY'
 FROM           VW_PLANNED_REQMNTS_TXT P
 WHERE          P.PLANT_CODE IN ('6040','6041')
 AND            P.STOCK_CATEGORY IN ('A60385000','A60385003')
 AND            P.DISTRIBUTION_VERSION_CODE IN ('00','01','ZU','Z2')
 AND            P.REQUIREMENTS_DATE < GETDATE() - 59
 AND            P.PLANNED_QTY > 0 
 ORDER BY       P.PLANT_CODE,
                P.STOCK_CATEGORY,
                P.MATERIAL,
                P.REQUIREMENTS_DATE,
                P.TECHNICAL_INDEX

2voto

Petr Abdulin Punkte 32034

Sie können diese "Vorlage" für Select-Joins verwenden:

SELECT * -- 
FROM 
    (SELECT  WHERE ) Q1
LEFT JOIN
    (SELECT  WHERE ) Q2
-- fügen Sie bei Bedarf weitere Joins hinzu
ON
    Q1.pk = Q2.pk

Der einzige verbleibende Teil besteht darin, den Primärschlüssel zu identifizieren, an dem die Selects verbunden werden.

P.S. Natürlich ist es nicht unbedingt nur LEFT JOIN, das ist normalerweise das, was Sie wollen.

2voto

AlwaysLoadingData Punkte 221

Je nach Situation gibt es verschiedene Strategien, um bedingt bestimmte Spaltendaten aus der Abfrage auszuschließen.

Wenn eine Teilmenge der anderen entspricht, können Sie CASE verwenden, um unerwünschte Werte auszuschließen

SELECT
   PS.ProductShipmnetId
   ,PS.ShipmentDate
   ,PS.ProductQty
   ,CASE 
      WHEN PS.ShipmentDate BETWEEN GETDATE() AND DATEADD(MONTH, 1, GETDATE()) 
         THEN PS.ProductQty 
    END AS ProductQtyThisMonth
FROM
   ProductShipment PS
WHERE
   PS.ShipmentDate > DATEADD(MONTH, -1, GETDATE())

Wenn die WHERE-Klauseln sich nicht überschneiden, ist möglicherweise ein UNION ALL die bessere Wahl. Sie könnten auch beide Bedingungen mit OR verknüpfen und für jede Rückgabe eine Bedingung hinzufügen.

SELECT
   PS.ProductShipmnetId
   ,PS.ShipmentDate
   ,PS.ProductQty AS ProductQtyAncient
   ,NULL AS ProductQtyFuturistic
FROM
   ProductShipment PS
WHERE
   PS.ShipmentDate < DATEADD(YEAR, -1, GETDATE())
UNION ALL
SELECT
   PS.ProductShipmnetId
   ,PS.ShipmentDate
   ,NULL AS ProductQtyAncient
   ,PS.ProductQty AS ProductQtyFuturistic
FROM
   ProductShipment PS
WHERE
   PS.ShipmentDate > DATEADD(YEAR, 1, GETDATE())

Ich sehe diese Techniken häufiger bei Aggregatsfunktionen verwendet und Sie erwähnen, dass dies Teil einer größeren Abfrage ist, deshalb möchte ich sicherstellen, dass Sie sich dessen bewusst sind.

SELECT
   PS.ProductId
   ,SUM(CASE WHEN PS.ShipmentDate BETWEEN GETDATE() AND DATEADD(MONTH, 1, GETDATE())
           THEN PS.ProductQty END) AS ProductQtyThisMonth
   ,SUM(CASE WHEN PS.ShipmentDate BETWEEN DATEADD(MONTH, -1, GETDATE()) AND GETDATE()
           THEN PS.ProductQty END) AS ProductQtyLastMonth
FROM
   ProductShipment PS
WHERE
   PS.ShipmentDate BETWEEN DATEADD(MONTH, -1, GETDATE()) 
       AND DATEADD(MONTH, 1, GETDATE())
GROUP BY
   PS.ProductId

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X