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

1つのクエリで複数の日付範囲を合計しますか?

    私があなたの要求を正しく理解していると仮定すると、あなたが必要としているのはこれらの線に沿ったものだと思います:

    SELECT "periods"."start_date", 
           "periods"."end_date", 
           SUM(CASE WHEN "balance_transactions"."created" BETWEEN "periods"."start_date" AND "periods"."end_date" THEN "balance_transactions"."fee" ELSE 0.00 END) AS period_sum
      FROM "balance_transactions" 
      JOIN charges ON balance_transactions.source = charges.balance_id 
      JOIN ( SELECT '2013-12-20'::date as start_date, '2014-01-19'::date as end_date UNION ALL
             SELECT '2013-12-21'::date as start_date, '2014-01-20'::date as end_date UNION ALL
             SELECT '2013-12-22'::date as start_date, '2014-01-21'::date as end_date UNION ALL
             SELECT '2013-12-23'::date as start_date, '2014-01-22'::date as end_date UNION ALL
             SELECT '2013-12-24'::date as start_date, '2014-01-23'::date as end_date
             ) as periods
        ON "balance_transactions"."created" BETWEEN "periods"."start_date" AND "periods"."end_date"
     WHERE "balance_transactions"."account_id" = 6 
       AND "balance_transactions"."type" = 'charge' 
       AND "charges"."refunded" = false 
       AND "charges"."invoice" IS NOT NULL
     GROUP BY "periods"."start_date", "periods"."end_date"
    

    これにより、1つの結果セットに関心のあるすべての期間が返されます。クエリはフロントエンドでオンザフライで「生成」されるため、期間部分に必要な数の行を追加できます。

    編集:試行錯誤を繰り返しながら、[sqlFiddle] [1]で動作させることができ、それに応じて上記の構文を更新しました。



    1. IDを生成した後、Magentoが顧客の保存に失敗するのはなぜですか?

    2. MySQL日付が1か月を超える場合はどこですか?

    3. アクセスデータベースを超高速にする方法!

    4. tinyintをブール休止状態としてマップします