2017-12-25 7 views
1
SELECT 
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 1 THEN sm.GrandTotal ELSE 0 END) AS 'January', 
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 2 THEN sm.GrandTotal ELSE 0 END) AS 'February', 
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 3 THEN sm.GrandTotal ELSE 0 END) AS 'March', 
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 4 THEN sm.GrandTotal ELSE 0 END) AS 'April', 
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 5 THEN sm.GrandTotal ELSE 0 END) AS 'May', 
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 6 THEN sm.GrandTotal ELSE 0 END) AS 'June', 
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 7 THEN sm.GrandTotal ELSE 0 END) AS 'July', 
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 8 THEN sm.GrandTotal ELSE 0 END) AS 'August', 
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 9 THEN sm.GrandTotal ELSE 0 END) AS 'September', 
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 10 THEN sm.GrandTotal ELSE 0 END) AS 'October', 
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 11 THEN sm.GrandTotal ELSE 0 END) AS 'November', 
SUM(CASE MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) WHEN 12 THEN sm.GrandTotal ELSE 0 END) AS 'December' 
FROM 
    sales_master sm 
WHERE 
    YEAR(str_to_date(sm.BillDate, '%d/%m/%Y'))='2017' 
GROUP BY 
    MONTH(str_to_date(sm.BillDate, '%d/%m/%Y')) 

私は、毎年特定の年に毎月総支出額を必要としているMySQLを使用しています(ある月に支出額がない場合はゼロを出力する必要があります) 。 上記のクエリは、私が必要とするものを正確に行いますが、別々の行に合計値を取得します。 私は何ヶ月もの間、すべての値が1つの行に入るようなものが必要です。私は簡単に読むことができます。 Result I get1年間の各月の合計金額を取得

+0

あなたのアプリケーションコードにデータ表示の問題を扱うことを真剣に考えてください。 – Strawberry

+0

@Strawberry私はあなたが言うことを得られませんでした。 –

+0

PHPを使用していますので、データをフォーマットするのにsqlではなくそれを使用してください。 – Strawberry

答えて

1

あなたは近くです。 GROUP BYを削除するだけです。

文字列として日付を格納しないでください。まれに、それが必要です。しかし、タイプの書式を修正することをお勧めします。そのため、日付は日付として保存されます。

第2に、likeを使用してロジックを単純化できます。あなたは、文字列を持っている場合は、使用の文字列操作:

SELECT SUM(CASE WHEN sm.BillDate LIKE '%/01/%' THEN sm.GrandTotal ELSE 0 END) AS January, 
     . . . 

第三に、整数を返すので、比較は整数にする必要がありますYEAR()。しかし、ただやる、値が文字列であることを考える:

WHERE BillDate LIKE '%2017' 

あるいは、先に述べたように、あなたが適切なデータ型を使用して日付を格納しているので、あなたのデータを修正します。

+0

ありがとう@Gordonそれは働いた。しかし、なぜ以前にはうまくいかなかったのですか?これは、既にCASEステートメントで月をグループ化しているため、明示的にそれらを再度グループ化する必要はないからです。 –

+0

@Roneetshaw。 。 。 'GROUP BY'は毎月別の行を持つ結果セットを記述していました。 –

+0

データ型を変更することは、私が以前にすべきだったことです。しかし、今私は非常に遠くに来ました:(次回は心に留めておきます。 –

関連する問題