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

解決済みの質問

Sqlite3にて、縦持ちデータの一部を横持ち

お世話になります。

Sqlite3 windows7 使用です。


Sqlite3にて縦持ちの一部を横持ちにする作業をしています。

text_date|name|uriage
05_01  aaa  1
05_01  bbb  2
05_01  ccc  3
05_01  ddd  4
05_01  eee  5
05_02  aaa  6
05_02  bbb  7
05_02  ccc  8
05_02  ddd  9
05_02  fff  10
05_03  aaa  11
05_03  bbb  12
05_03  ccc  13
05_03  ddd  14
05_03  ggg  15
05_04  aaa  16
05_04  bbb  17
05_04  ccc  18
05_04  ddd  19
05_04  hhh  20


列:text_dateには、日付がテキストデータで入力されています。
列:nameには、同一でない名前が一部含まれます。
列:uriageは、INTEGERにて入力されています。

この表の日付(text_date)の任意の2日分を、
名前ごとにグループ化し、日付を横列展開にてuriageの表示をしたいです。

例えば、日付が05_03 と 05_04 のデータを下記のように取得したいです。
name|uriage_03|uriage_04
aaa   11    16
bbb   12    17
ccc   13    18
ddd   14    19
ggg   15  
hhh        20

下記のSQL文で
名前(name)をグループ化する前の横列展開はできるのですが、
名前をグループ化すると、片方の日付しか表示されなくなります。
(重複のない人は、そのまま表示されるます)

-------------------

select name
,case
 when text_date = '05_03' then uriage
end as uriage_03
,case
 when text_date = '05_04' then uriage
end as uriage_04
from (
select * from test1
where text_date = '05_03'
or text_date = '05_04'
)
group by name   ←*group byを入れると片方の日付だけが表示

-------------------
↓nameをグループ化すると片方の日付のみが表示
name|uriage_03|uriage_04
aaa        16
bbb        17
ccc        18
ddd        19
ggg   15  
hhh        20

正しいコードをご教示いただけますと幸いです。

よろしくお願いします。

投稿日時 - 2017-05-09 16:46:49

QNo.9327194

困ってます

質問者が選んだベストアンサー

nameでグループ化するということは、そのグループ内にあった(同一のnameの)uriage_03やuriage_04を「どうするか」を指示しないといけません。

name|uriage_03|uriage_04
aaa   11 
aaa        16

というデータから「存在する値だけを取り出す」ことをしたいのであれば、そうなるように工夫しないといけません(勝手に集約してくれる道理はない)。


select name,
sum(case when text_date = '05_03' then uriage else 0 end) as uriage_03,
sum(case when text_date = '05_04' then uriage else 0 end) as uriage_04
from test1
where (text_date = '05_03') or (text_date = '05_04')
group by name

とすればいいと思います(SQLite3環境がないのでMySQLで検証しました)。

#レコードが存在しなかった日付の列が(null ではなく)0 になって
#しまいますが、null で取得するよりも扱いやすいでしょ?

投稿日時 - 2017-05-11 10:18:21

お礼

shimix さま

早速の、とてもわかり易いご回答
ありがとうございました!

>「どうするか」を指示しないといけません。
>(勝手に集約してくれる道理はない)


腑に落ちました!!!

ちょうど、今日、本で似たような構文の
MAX(CASE WHEN ~~)を見つけていたのですが、
どうも、分かったような分からないような感覚でしたが
お陰様で、すっと頭に入りました!!!

今後ともよろしくお願いします。

投稿日時 - 2017-05-11 18:46:29

ANo.1

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

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

回答(1)

あなたにオススメの質問