こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

SQL分の作り方

以下のようなテーブルがあります

name point date
A 1 2014/1/1
B 2 2014/1/1
C 3 2014/1/1
A 1 2014/2/1
B 3 2014/2/1
C 2 2014/2/1
A 2 2014/3/1
B 4 2014/3/1
C 3 2014/3/1

上記のテーブルを

name point(2014/1) point(2014/2) point(2014/3)
A 1 1 2
B 2 3 4
C 3 2 3
というように並べるにはどのようなSQLを打てばよいでしょうか。

以下のようなSQLを打ってみたらデータ量が多いときになかなか応答が帰ってきません。

SELECT name, ifnull(sum(CASE WHEN date = '2014-01-01' THEN point END),'-') as point(2014/1),ifnull(sum(CASE WHEN date = '2014-02-01' THEN point END),'-') as point(2014/2),ifnull(sum(CASE WHEN date like '2014-03-01' THEN point END),'-') as point(2014/3) FROM tableA GROUP BY name

投稿日時 - 2014-03-22 14:55:28

QNo.8524140

暇なときに回答ください

このQ&Aは役に立ちましたか?

11人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

こういうのは条件と数値の積をとってsumするのが普通です

//元データ
create table tbl(name varchar(10),point int,d date);
insert into tbl values('A',1,'2014-01-01'),('B',2,'2014-01-01'),('C',3,'2014-01-01'),('A',1,'2014-02-01'),('B',3,'2014-02-01'),('C',2,'2014-02-01'),('A',2,'2014-03-01'),('B',4,'2014-03-01'),('C',3,'2014-03-01');

//集計
select name
,sum(point*(d between '2014-01-01' and '2014-01-31')) as `point(2014/1)`
,sum(point*(d between '2014-02-01' and '2014-02-28')) as `point(2014/2)`
,sum(point*(d between '2014-03-01' and '2014-03-31')) as `point(2014/3)`
from tbl
group by name:

投稿日時 - 2014-03-24 09:26:58

ANo.1

kan-chi さん

次のSQLで希望されている結果でデータが取得できます。ご確認下さい。


SELECT A.name, A.point, B.point, C.point
FROM
(
SELECT name, point, date
FROM table_a
WHERE date='2014-01-01'
) AS A
LEFT JOIN (
SELECT name, point, date
FROM table_a
WHERE date='2014-02-01'
) AS B ON A.name=B.name
LEFT JOIN (
SELECT name, point, date
FROM table_a
WHERE date='2014-03-01'
) AS C on A.name=C.name
ORDER BY A.name

投稿日時 - 2014-03-23 10:02:46

あなたにオススメの質問