Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多个子查询作为实例的字段的SQL条件_Sql_Sas_Proc Sql - Fatal编程技术网

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

使用多个子查询作为实例的字段的SQL条件,sql,sas,proc-sql,Sql,Sas,Proc Sql,我正在使用procsql,但这个问题应该与所有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.P

我正在使用procsql,但这个问题应该与所有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;

当我运行这个查询时,它卡在数据步骤上,30分钟后,我停止了查询。我这样做对吗?如果有更好的方法,请让我知道

通常我会避免在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
由于您使用的是GROUPBY子句,因此它将返回多个观察结果

子查询不应该看起来更像吗

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\u NO\u ID。

如果没有您正在组合的数据样本,我们真的无法对此进行测试。您是否可以发布
RSCCParts
DPO.DPO\u PART\u ORD\u HST
DPO.DPO\u PART\u HST\u MAIN
表的示例数据?这是一个通用示例。我的代码只是为了说明这样一个程序是否可行。您可以使用自己的数据创建类似的程序。不幸的是,我不允许发布这些表的数据。不需要发布真实数据。只要做一些记录来证明这个问题。或者使用SASHELP.CLASS或SASHELP.CARS等表创建一个示例,每个人都可以在SAS中使用这些表。谢谢Tom。你的建议恰到好处。我是按照您的建议来做的,特别是关于主查询的别名和将其用作相关子查询的建议。