我正在使用Proc SQL,但这个问题应该与所有SQL变体相关。我正在尝试使用来自两个子查询的值填充字段BruceDPOtest
,如果第一个查询导致空白 - CASE WHEN BruceDPO = INPUT("", 8.)
- 用另一个子查询的BruceDPO值填充该空白:
THEN (
SELECT SUM(PART_QTY) FROM RSCCParts LEFT JOIN DPO.DPO_PART_ORD_HST AS Total
ON RSCCParts.PartID = STRIP(Total.PART_NO_ID)
WHERE PUT(PROC_DT, YY.) LIKE '%2016%' GROUP BY PART_NO_ID) ELSE BruceDPO END
例如,第一个查询给出以下结果;
Part DPO
1234 100
1235
引用可以填充第二行的数据的第二个子查询运行得到:
Part DPO
1234 100
1235 999
以下是完整代码:
PROC SQL;
CREATE VIEW DPOMergeView AS(SELECT *,
CASE
WHEN BruceDPO = INPUT("", 8.) THEN (
SELECT SUM(PART_QTY) FROM RSCCParts LEFT JOIN DPO.DPO_PART_ORD_HST AS Total
ON RSCCParts.PartID = STRIP(Total.PART_NO_ID)
WHERE PUT(PROC_DT, YY.) LIKE '%2016%' GROUP BY PART_NO_ID)
ELSE BruceDPO
END
AS BruceDPOtest
FROM
RSCCParts
LEFT JOIN (SELECT RSCCParts.PartID AS BrucePartID, BruceDPO, Year
FROM RSCCParts
LEFT JOIN
(SELECT PART_NO_ID AS PartNumber, SUM(PART_QTY) AS BruceDPO, STRIP(YR) AS Year
FROM
DPO.DPO_PART_HST_MAIN
WHERE YR = '2016'
GROUP BY PartNumber, Year) AS FQuery
ON
RSCCParts.PartID = STRIP(FQuery.PartNumber)) AS B
ON RSCCParts.PartID = B.BrucePartID);
QUIT;
当我运行此查询时,它会停留在DATA Step上,30分钟后,我停止了查询。我这样做了吗?如果有更好的方法,请告诉我!
答案 0 :(得分:1)
通常我在SQL中避免使用相关子查询,因为它只是让你觉得你试图通过记录而不是组合集来处理数据记录。但是如果你做了什么使用语法,如
case when (x) then (sub query result) else variable_name end
然后子查询只需要返回一个值。您的查询
SELECT SUM(PART_QTY)
FROM RSCCParts LEFT JOIN DPO.DPO_PART_ORD_HST AS Total
ON RSCCParts.PartID = STRIP(Total.PART_NO_ID)
WHERE PUT(PROC_DT, YY.) LIKE '%2016%'
GROUP BY PART_NO_ID
看起来它将返回多个观察结果,因为您正在使用GROUP BY子句。
该子查询不应该更像
SELECT SUM(Total.PART_QTY)
FROM DPO.DPO_PART_ORD_HST AS Total
WHERE RSCCParts.PartID = STRIP(Total.PART_NO_ID)
AND PUT(PROC_DT, YY.) LIKE '%2016%'
您的查询有多个对RSCCPARTS表的引用,因此您可能需要为每个引用一个别名,以便您可以阐明要使用哪个来使PARTID与PART_NO_ID匹配。