我试图找出从同一个表中两次选择列的最简单方法,但是将它作为更大查询的一部分并排显示两个不同的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
答案 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