从同一个表中选择一列两次,使用两个WHERE条件SQL SERVER

时间:2014-04-15 23:59:08

标签: sql sql-server join

我试图找出从同一个表中两次选择列的最简单方法,但是将它作为更大查询的一部分并排显示两个不同的WHERE条件(如下)。实现这一目标的最佳方法是什么?

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

2 个答案:

答案 0 :(得分:1)

您可以使用此&#34;模板&#34;对于选择连接:

SELECT * -- <your final query, use Q1.field and Q2.field>
FROM 
    (SELECT <query1> WHERE <condition1>) Q1
LEFT JOIN
    (SELECT <query2> WHERE <condition2>) Q2
-- add more joins if necessary
ON
    Q1.pk = Q2.pk

唯一剩下的部分是识别选择将加入的主键。

P.S。当然,它不一定只是LEFT JOIN,它通常是你想要的。

答案 1 :(得分:1)

根据具体情况,有一些不同的策略可以有条件地从查询中排除特定的列数据。

如果其中一个是另一个的子集,则可以使用CASE排除不需要的值

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())

如果where子句不重叠,那么UNION ALL可能是更好的选择。您也可以同时OR两个条件,并为每次返回添加一个案例。

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())

我更常见的是这些与聚合函数一起使用的技术,你提到这是一个更大的查询的一部分,所以我想确保你也意识到这一点。

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