2

次の表があります。

DATE  | AMT
10/10 | 300
12/10 | 300
01/11 | 200
03/11 | 100

毎月の合計を取得するにはどうすればよいですか? 次のような結果-

DATE | TOT
1010 | 300
1110 | 300
1210 | 600 
0111 | 800
0211 | 800
0311 | 900

次のようなSQL文

SELECT SUM(AMT) FROM TABLE1 WHERE DATE BETWEEN '1010' AND '0111'

0111 の場合は 800 になりますが...

注記日付の制限はありません。これは私のジレンマです。すべての日付に対してループを実行せずにこの列に入力し、欠落している月も表示するにはどうすればよいですか?

4

4 に答える 4

2

欠落している月に対応するには、結合するテンプレート テーブルを作成します。

キャッシングと考えてください。ループしてギャップを埋めるのではなく、カレンダーをデータベースにキャッシュするだけです。

複数のカレンダー (月の始まり、週の始まり、祝日、営業日など) をすべて 1 つのテーブルにまとめて、多数の検索フラグとインデックスを使用することもできます。

あなたは次のようなものになります...

SELECT
  calendar.date,
  SUM(data.amt)
FROM
  calendar
LEFT JOIN
  data
    ON  data.date >= calendar.date
    AND data.date <  calendar.date + INTERVAL 1 MONTH
WHERE
      calendar.date >= '20110101'
  AND calendar.date <  '20120101'
GROUP BY
  calendar.date

編集

OPが現在の合計を必要としていることに気付きました。

これは SQL では可能ですが、非常に非効率的です。その理由は、ある月の結果が翌月の計算に使用されないためです。代わりに、実行中の合計全体を再度計算する必要があります。

このため、通常は、上記のように月間合計を計算し、アプリケーションを使用して反復して現在の合計値を作成することを強くお勧めします。

あなたが本当にSQLでそれをしなければならないなら、それは次のようになります...

SELECT
  calendar.date,
  SUM(data.amt)
FROM
  calendar
LEFT JOIN
  data
    ON  data.date >= @yourFirstDate
    AND data.date <  calendar.date + INTERVAL 1 MONTH
WHERE
      calendar.date >= @yourFirstDate
  AND calendar.date <  @yourLastDate
GROUP BY
  calendar.date
于 2012-02-21T17:16:37.723 に答える
0

その場で範囲を生成し、その値を間隔として DATE_ADD に渡し、基本的に一連の月の値を投影することもできます。

@Demsが言ったように、相関サブクエリで実行中の合計を計算する必要があります。これは、ネストされたループを内部で実行するため、非常に非効率的です。

シーケンスを生成する方法を確認するには、私の投稿をチェックしてください: Mysql で数値の範囲を生成する方法

最後のクエリは次のようになります (ちなみに、この varchar の混乱ではなく、日付列が必要です)。

/*NOTE: This assumes a derived table (inline view) containing the sequence of date values and their corresponding TOT value*/
SELECT
  DATEVALUES.DateValue,
  (
  SELECT SUM(TABLE1.AMT) FROM TABLE1 WHERE TABLE1.DateValue <= DATEVALUES.DateValue)
  ) AS RunningSubTotal
FROM
  DATEVALUES

またはそのようなもの。

于 2012-02-21T17:34:08.113 に答える
0

主な問題は、and have the missing months displayed as well? 表示される月\年の組み合わせを含む補助テーブルなしでそれを行う方法がわからないことです。

create table table1(
date datetime,
amt int
)
insert into table1 values ('10/10/2010',100)
insert into table1 values ('12/12/2010',200)
insert into table1 values ('01/01/2011',50)
insert into table1 values ('03/03/2011',500)

truncate table #dates
create table #dates(
_month int,
_year int
)
insert into #dates values(10,2010)
insert into #dates values(11,2010) --missing month
insert into #dates values(12,2010)
insert into #dates values(01,2011)
insert into #dates values(02,2011)--missing month
insert into #dates values(03,2011)


select D._month, D._year, sum(amt)
from #dates D left join TABLE1 T on D._month=month(T.date) and D._year=year(T.date)
group by D._month, D._year
于 2012-02-21T17:31:51.210 に答える
-2
select sum(AMT) from TABLE1 group by Date
于 2012-02-21T17:17:03.170 に答える