1

次のSQLクエリがあります:( Oracle 10 )

SELECT
     A.ID,
     SUM(A.AMT_CR) - SUM(A.AMT_DR) AS balAmt,
     P.NAME
FROM TABLE1 A, TABLE2 P
WHERE P.ID BETWEEN 'C0100' AND 'C0200'
    AND P.ID = A.ID
    AND A.TRANS_DATE < '01-FEB-2013'
GROUP BY A.ID, P.NAME
ORDER BY A.ID

上記のクエリは問題なく実行されますが、このクエリには条件がありますAND A.TRANS_DATE < '01-FEB-2013'。この条件は、 のbalAmt前にを取得するためのものTRANS_DATEです。IDsただし、このクエリの問題は、条件に関してのみ取得されるAND A.TRANS_DATE < '01-FEB-2013'ことです。aが未満でIDない場合、そのレコードは表示されません。TRANS_DATE'01-FEB-2013'ID

IDsだから私はデータベースからすべてを取得したい。balAmtしかし、私は条件に関して取得したいAND A.TRANS_DATE < '01-FEB-2013'..

任意の提案をいただければ幸いです。

前もって感謝します。

4

3 に答える 3

1

これは次のことを行う必要があります。

SELECT
     A.ID,
     SUM(A.AMT_CR) - SUM(A.AMT_DR) AS balAmt,
     P.NAME
FROM TABLE1 A
LEFT JOIN TABLE2 P ON P.ID = A.ID
                   AND A.TRANS_DATE < '01-FEB-2013'
                   AND P.ID BETWEEN 'C0100' AND 'C0200'
GROUP BY A.ID, P.NAME
ORDER BY A.ID
于 2013-03-21T07:04:59.840 に答える
1
SELECT
     A.ID,
     SUM(case when A.TRANS_DATE < '01-FEB-2013' 
         then nvl(A.AMT_CR,0) - nvl(A.AMT_DR,0)
         else 0
         end) AS balAmt,
     P.NAME
FROM TABLE1 A, TABLE2 P
WHERE P.ID BETWEEN 'C0100' AND 'C0200'
    AND P.ID = A.ID
GROUP BY A.ID, P.NAME
ORDER BY A.ID
于 2013-03-21T07:02:13.557 に答える
1


SELECT Q.ID, W.balmt, W.NAME
FROM TABLE1 Q
LEFT JOIN (
SELECT
     A.ID,
     SUM(A.AMT_CR) - SUM(A.AMT_DR) AS balAmt,
     P.NAME
FROM TABLE1 A, TABLE2 P
WHERE P.ID BETWEEN 'C0100' AND 'C0200'
    AND P.ID = A.ID
    AND A.TRANS_DATE < '01-FEB-2013'
GROUP BY A.ID, P.NAME
) W
ON Q.ID = W.ID
ORDER BY A.ID

于 2013-03-21T06:39:21.197 に答える