2

次のフィールドで構成されるテーブルbilling_historyがあります

CREATE TABLE [dbo].[BILLING_HISTORY2](
[ID] [int] IDENTITY(1,1) NOT NULL,
[READING_MONTH_YEAR] [date] NULL,
[READING] [int] NULL,
[CONSUMER_ID] [int] NULL,
[payment_status] [bit] NOT NULL
) 

http://www.sqlfiddle.com/#!3/892e0/5

次のクエリは、消費者の最大支払額と最大未払い値を返します

SELECT MAX(READING) AS 'MAXIMUM_PAID_READING',consumer_id from billing_history2
where payment_status=0 GROUP BY consumer_id;

SELECT MAX(READING) AS 'MAXIMUM_UNPAID_READING',consumer_id from billing_history2
where payment_status=1 GROUP BY consumer_id;

ただし、それらを結合してMAXIMUM_UNPAID_READINGからMAXIMUM_PAID_READINGを減算し、現在の読み取り値を取得すると、上記の2つのクエリを結合することにより、consumer_idが一致するすべてのレコードが返されます。したがって、消費者がまだ請求書を支払っていない場合、PAID_READINGでIDが省略されるため、INNERJOINは結果を返しません。FULL OUTER JOINを使用すると、すべてのレコードが返されますが、差はNULLに設定されます。

以前の未払いの使用量から顧客の現在の使用量を差し引くことによって、顧客の現在の使用量を知る必要があります。

その人が過去に請求書を支払ったかどうかに関係なく、結果として生じる差が見つかるように、これら2つのクエリを結合するにはどうすればよいですか。

4

3 に答える 3

1

それらに参加しないでください。

SELECT
    MAX(CASE WHEN payment_status=0 THEN READING ELSE NULL END) AS 'MAXIMUM_PAID_READING',
    MAX(CASE WHEN payment_status=1 THEN READING ELSE NULL END) AS 'MAXIMUM_UNPAID_READING',

    MAX(CASE WHEN payment_status=0 THEN READING ELSE NULL END)
     - MAX(CASE WHEN payment_status=1 THEN READING ELSE NULL END)
        AS 'DIFF_READING',

    consumer_id from billing_history2
GROUP BY consumer_id;

MAX関数からNULL値を処理する場合は、ISNULL関数を使用します。

SELECT
    ISNULL(MAX(CASE WHEN payment_status=0 THEN READING ELSE NULL END),0) AS 'MAXIMUM_PAID_READING',
    ISNULL(MAX(CASE WHEN payment_status=1 THEN READING ELSE NULL END),0) AS 'MAXIMUM_UNPAID_READING',

    ISNULL(MAX(CASE WHEN payment_status=0 THEN READING ELSE NULL END),0)
     - ISNULL(MAX(CASE WHEN payment_status=1 THEN READING ELSE NULL END),0)
        AS 'DIFF_READING',

    consumer_id from billing_history2
GROUP BY consumer_id;
于 2013-02-18T07:46:16.077 に答える
0

左外部結合を使用しても問題ありませんが、最大値にisnullを使用してください。

元:

max(...) - isnull(max(...),0) as ...
于 2013-02-18T07:48:47.987 に答える
0

あなたの場合、CASE式を使用する必要があります

SELECT CONSUMER_ID,
       MAX(CASE WHEN payment_status = 0 THEN READING ELSE 0 END) AS 'MAXIMUM_PAID_READING',
       MAX(CASE WHEN payment_status = 1 THEN READING ELSE 0 END) AS 'MAXIMUM_UNPAID_READING', 
       MAX(CASE WHEN payment_status = 0 THEN READING ELSE 0 END) - 
       MAX(CASE WHEN payment_status = 1 THEN READING ELSE 0 END) AS diff
FROM billing_history2
GROUP BY consumer_id

SQLFiddleのデモ

于 2013-02-18T07:50:37.773 に答える