2017-03-29 29 views
1

私はProc SQLを使用していますが、この質問はすべてのSQLバリアントに関連する必要があります。私は別のサブクエリのBruceDPO値を空白にすることをいっぱい--it blanks-- CASE WHEN BruceDPO = INPUT("", 8.)の最初のクエリ結果であれば2つのサブクエリからの値を持つフィールドBruceDPOtestを移入しようとしています:たとえば複数のサブクエリを使用するフィールドのSQLの条件付き条件

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 

第二列を移入することができます参照データを取得するために実行されていることを第二副問合せ:私はこのクエリを実行すると、

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; 

:ここ

Part DPO 

1234 100 
1235 999 

は完全なコードですそれはデータステップで立ち往生し、30分後に私はクエリを停止しました。私はこれを正しくしていますか?これを行うより良い方法がある場合は、私に知らせてください!

+1

実際には、結合するデータのサンプルがないとこれをテストすることはできません。 'RSCCParts'、' DPO.DPO_PART_ORD_HST'、 'DPO.DPO_PART_HST_MAIN'テーブルのサンプルデータを投稿できますか? – Tom

+0

これは一般的な例です。私のコードは、そのようなプログラムが可能かどうかを示すためのものです。独自のデータを使用して同様のプログラムを作成できます。残念ながら、私はそれらのテーブルのデータを投稿することはできません。 –

+0

REALデータを送信する必要はありません。問題を示すレコードをいくつか作成してください。また、SASHELP.CLASSやSASHELP.CARSのようなテーブルを使って、誰もが既にSASで利用可能な例を作成することもできます。 – Tom

答えて

1

通常は、SQLで相関サブクエリを使用しないようにします。これは、セットを結合するのではなく、レコードごとにデータレコードを処理しようとしているように感じるからです。あなたは

case when (x) then (sub query result) else variable_name end 

のような構文を使用するように何をした場合しかし、その後サブクエリは、1つの値のみを返す必要があります。あなたのクエリ

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句を使用しているので、複数の観測結果を返すようです。

は、より多くのあなたが取得するために使用したい1明確にできるように、それぞれにエイリアスを導入する必要がある場合がありますので、あなたのクエリはRSCCPARTSテーブルに複数の参照を持つ

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%' 

のようなそのサブクエリ見てはいけませんPARTIDからPART_NO_IDに一致するようにします。

+0

トムありがとう。あなたの提案にスポットがあります。私はあなたのアドバイスに従い、特にメインクエリのエイリアスとそれを相関サブクエリとして使用することで、それを実現しました。 –

関連する問題