sql >> データベース >  >> RDS >> PostgreSQL

groupby句に列を追加せずにSQL結合で列を使用する

    請求書ごとに1行が必要なので、payment_invoiceを集計します。 最初-参加する前に最適です。
    テーブル全体を選択した場合、通常は最初に集計 および後で参加

    SELECT to_char(date_trunc('month', i.create_datetime), 'MM/YYYY') AS month
         , count(*)                                   AS total_invoice_count
         , (sum(i.total) - COALESCE(sum(pi.paid), 0)) AS outstanding_balance
    FROM   invoice i
    LEFT   JOIN  (
        SELECT invoice_id AS id, sum(amount) AS paid
        FROM   payment_invoice pi
        GROUP  BY 1
        ) pi USING (id)
    GROUP  BY date_trunc('month', i.create_datetime)
    ORDER  BY date_trunc('month', i.create_datetime);
    

    LEFT JOIN ここでは不可欠です。 Payment_invoiceに対応する行がない請求書を失いたくない (まだ)、これは単純な<​​code> JOINで発生します 。

    したがって、COALESCEを使用してください() NULLの可能性がある支払いの合計。

    SQLフィドル テストケースが改善されました。



    1. PostgreSQLCASE...複数の条件で終了

    2. PostgreSQL、行を更新できません(行レベルのセキュリティ付き)

    3. デカルト積の結合と削除

    4. PostgreSQL用のJavaプリペアドステートメント