2012-05-02 7 views
0

は、私は今、私はMySQLは、elseまたはcase ..を使用して出力をクエリしますか?

Month TOTAL 
01 12345 
02 0 
03 0 
04 0 
05 400 
06 12345 
07 0 
08 0 
09 0 
10 0 
11 0 
12 0 

ほかのまたはケースの場合を使用して可能であるとして、私の出力をしたい

month_xの最後の2桁が数ヶ月ある
mysql> select * FROM testa; 
+---------+-------+ 
| month_x | money | 
+---------+-------+ 
| 11101 | 12345 | 
| 11105 | 100 | 
| 11105 | 100 | 
| 11105 | 100 | 
| 11105 | 100 | 
| 11106 | 12345 | 
+---------+-------+ 
6 rows in set (0.00 sec) 

としてテーブルを持っています。

答えて

1

このためには、最初に月の数値で表を作成する必要があります。

CREATE TABLE `months` (
    `mon` int(11) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
INSERT INTO `months` VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12); 

それは月が私の実際のテーブル01,05を同様に存在しない場合、私はしたいok.butある

+------+-------+ 
| mon | money | 
+------+-------+ 
| 1 | 12345 | 
| 2 |  0 | 
| 3 |  0 | 
| 4 |  0 | 
| 5 | 400 | 
| 6 | 12345 | 
| 7 |  0 | 
| 8 |  0 | 
| 9 |  0 | 
| 10 |  0 | 
| 11 |  0 | 
| 12 |  0 | 
+------+-------+ 
+0

それは単一のテーブルではできません.. ?? –

+0

いいえ、それは不可能です。しかし、あなたはすべてのことを手続きに入れることができます。しかし、このようなクエリのために毎回テンポラリテーブルを作成するとパフォーマンスが低下します。そういうわけで、そのような永久的なテーブル –

2

次に、あなたのデータは「によってグループ化されたときに、あなたがmoneyを合計したいと仮定すると、(彼らは数が100で割った余りです)末尾2桁を取得するためにmodular arithmeticを使用することができます「月:また

SELECT month_x % 100 AS Month, SUM(money) AS TOTAL 
FROM testa 
GROUP BY Month 
ORDER BY Month ASC; 

、あなたが使用できるMySQLのimplicit type conversionに依存しており、その文字列関数を使用します。

SELECT RIGHT(month_x, 2) AS Month, SUM(money) AS TOTAL 
FROM testa 
GROUP BY Month 
ORDER BY Month ASC; 

@ shiplu.mokadd.im状態として

UPDATE

、(あなたはデータがないものもいる)、毎月、あなたは一時テーブルから12までの番号1を取得する必要がありますを表示します。ただし、UNIONを使用して、クエリで、このような一時テーブルを作成することができますので

 SELECT 1 
UNION SELECT 2 
UNION SELECT 3 -- etc 

ただし

SELECT Month, Sum(money) AS TOTAL 
FROM testa 
    RIGHT JOIN (
     SELECT 1 AS Month 
    UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 
    UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 
    UNION SELECT 12 
) months ON testa.month_x % 100 = months.Month 
GROUP BY Month; 

私はは通常 1が通常でこれを行いませんのでご注意ますあなたがデータベースにアクセスしている言語を問わず、1...12をループして、であると仮定します。もしrに対応するレコードがなければesultset。

+0

結果は、このクエリを実行します、06は存在しますが、今年は12ヶ月間ですので、それがベーステーブルにない場合は、合計を0として出力する必要があります。サンプル出力パターンを与えました。 –

+0

@AbdulManafこれは、一時的な表。私の答えを見てください。 –

+0

@AbdulManaf:上記の私の改訂版の回答を参照してください。 – eggyal

関連する問題