5

次のクエリがあります。

SELECT GVA12.FECHA_EMIS, GVA12.COD_VENDED, sum(GVA12.IMPORTE)
FROM GVA12
WHERE Month(GVA12.FECHA_EMIS)=Month(curDate())
  AND Year(GVA12.FECHA_EMIS)=Year(curDate())
  AND GVA12.COD_VENDED="EX"
  AND GVA12.T_COMP="FAC"
GROUP BY GVA12.FECHA_EMIS

これは月ごとのグラフです。2 つの質問があります。1 つ目は、月のすべての日付をゼロ (売り上げのない日付) として表示するにはどうすればよいか、2 つ目は、値を合計する方法があるので、最後の値はすべての合計になりますその価値。

編集:あなたのクエリで@Bluefeet、私は以下を作成しました、

SELECT Month(Days.DMY), Year(Days.DMY), GVA12.COD_VENDED, sum(GVA12.IMPORTE)
FROM Days
left join GVA12
    on Month(Days.DMY) = Month(GVA12.FECHA_EMIS)
    and Year(Days.DMY) = Year(GVA12.FECHA_EMIS)
WHERE Month(GVA12.FECHA_EMIS)=Month(curDate())
  AND Year(GVA12.FECHA_EMIS)=Year(curDate())
  AND GVA12.COD_VENDED="EX"
  AND GVA12.T_COMP="FAC"
GROUP BY Month(Days.DMY), Year(Days.DMY) WITH ROLLUP

結果を添付しました(スクリーンショット)。 ここに画像の説明を入力

私が望んでいたように、月のすべての日が表示されるわけではありません。私に何ができる?

編集 #3

現在は機能していますが、別のフィルターを追加したいと考えています。このフィルターはここに追加されますhttp://sqlfiddle.com/#!2/9d46c/1

4

3 に答える 3

5

合計を取得するにはGROUP BY WITH ROLLUP、すべての日付の合計を取得する を使用できます。

SELECT GVA12.FECHA_EMIS, GVA12.COD_VENDED, sum(GVA12.IMPORTE)
FROM GVA12
WHERE Month(GVA12.FECHA_EMIS)=Month(curDate())
  AND Year(GVA12.FECHA_EMIS)=Year(curDate())
  AND GVA12.COD_VENDED="EX"
  AND GVA12.T_COMP="FAC"
GROUP BY GVA12.FECHA_EMIS WITH ROLLUP

存在しない日付を返す限り、SO には次のような多くの質問があります。MySQL では、結合するテーブルを作成する方が簡単な場合があります。

日付範囲から日を生成する

2 つの日付の間の日付のリストを取得する

編集 #1: 日付を含むテーブルがある場合は、次のようなものを使用できます。

SELECT Month(d.yourDateCol), Year(d.yourDateCol), g.COD_VENDED, sum(g.IMPORTE)
FROM dates d
left join GVA12 g
    on Month(d.yourDateCol) = Month(GVA12.FECHA_EMIS)
    and Year(d.yourDateCol) = Year(GVA12.FECHA_EMIS)
WHERE Month(g.FECHA_EMIS)=Month(curDate())
  AND Year(g.FECHA_EMIS)=Year(curDate())
  AND g.COD_VENDED="EX"
  AND g.T_COMP="FAC"
GROUP BY Month(d.yourDateCol), Year(d.yourDateCol) WITH ROLLUP

編集#2:完全なテーブル構造またはいくつかのサンプルデータを表示せずに、機能しているクエリのバージョンを次に示します。

select month(d.dmy) Month, 
  year(d.dmy) Year, 
  coalesce(sum(g.Importe), 0) TotalImporte
from dates d
left join GVA12 g
  on month(d.dmy) = month(g.FECHA_EMIS)
  and year(d.dmy) = year(g.FECHA_EMIS)
group by month(d.dmy), year(d.dmy)  WITH ROLLUP

SQL Fiddle with Demoを参照してください。これは、テーブルにdates存在しない場合でも、テーブル内の各月/年の月/年を返します。GVA12

編集#3:最終合計だけでなく、現在の合計が必要な場合は、次を使用できるはずです:

SET @running_total := 0;

SELECT month(Days.DMY) Month, 
  Year(Days.DMY) Year, 
  Date(Days.DMY) Date,
  g.COD_VENDED,
  @running_total := @running_total + Coalesce(TotalImport, 0) as TotalImport
FROM Days
left join
(
  select FECHA_EMIS,
    COD_VENDED,
    sum(IMPORTE) TotalImport
  from GVA12
  group by Date(FECHA_EMIS), Year(FECHA_EMIS)
) g
  on date(Days.DMY) = date(g.FECHA_EMIS)
  and g.COD_VENDED='EX'
  and Month(g.FECHA_EMIS)=Month(curDate())
  and Year(g.FECHA_EMIS)=Year(curDate())
WHERE month(days.dmy)=Month(curDate())

デモで SQL Fiddle を参照してください

結果は次のとおりです。

| MONTH | YEAR |                           DATE | COD_VENDED | TOTALIMPORT |
----------------------------------------------------------------------------
|     1 | 2013 | January, 01 2013 00:00:00+0000 |     (null) |           0 |
|     1 | 2013 | January, 02 2013 00:00:00+0000 |         EX |        1000 |
|     1 | 2013 | January, 03 2013 00:00:00+0000 |         EX |        4000 |
|     1 | 2013 | January, 04 2013 00:00:00+0000 |     (null) |        4000 |
|     1 | 2013 | January, 05 2013 00:00:00+0000 |     (null) |        4000 |
|     1 | 2013 | January, 06 2013 00:00:00+0000 |     (null) |        4000 |
|     1 | 2013 | January, 07 2013 00:00:00+0000 |     (null) |        4000 |
于 2013-01-07T17:05:33.640 に答える
0

このリンクを見てください。2つの日付間のすべての日付をリストする方法が説明されています 2つの日付間の日付のリストを取得する

以下を使用してリストできますが、上記のリンクにはより良い解決策があると思います:

select a.Date 
from (
    select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
) a
where a.Date between '2012-12-01' and '2012-12-31';
于 2013-01-08T10:18:00.390 に答える
0

いくつかのアイデア:

1つ-比較するデータ値が必要なので、すべての日付を静的に保持する新しいテーブルを作成し、それに対して外部結合を実行して、確実にゼロを取得します。

2 - mysql についてはよくわかりませんが、Oracle ではこれは LAG 関数です。多分それはさらなる研究のための有益な指針です.

于 2013-01-07T17:03:53.220 に答える