SQL条件为使用多个子查询作为案例的字段

时间:2017-03-29 23:39:07

标签: sql sas proc-sql

我正在使用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分钟后,我停止了查询。我这样做了吗?如果有更好的方法,请告诉我!

1 个答案:

答案 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匹配。