質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Q&A

解決済

SQLiteでunionやgroup byを使って小計の入ったデータに整形したい

true
true

総合スコア440

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

2回答

0グッド

0クリップ

4237閲覧

投稿2015/09/06 16:04

編集2015/09/06 16:10

いつもありがとうございます。
ちょっとタイトルの意味がわかりづらくて恐縮ですが今回、sqliteでデータの小計を入れるというのをやっています。

データベースの設計は以下のとおりで、この例では最上位項目にカテゴリーとして、和食、洋食の2種類あり、さらに各々の下に具体的な料理名がぶら下がっており、各料理名は価格情報を持っています。そしてその価格の小計をやったうえで再度同じ順番で結果を出したいと思っております。

なにかいい方法、考え方などがあればご教示下さいますよう、お願い致します。

環境
sqlite3.8.5

CREATE TABLE test (id integer primary key, name text, cat integer, menu integer, price integer); 適当にデータを入れた結果 id name cat menu pric ---- ------------- ---- ---- ---- 10 和食 1 0 0 11 そば 1 1 100 12 うどん 1 2 100 20 洋食 2 0 0 21 オムライス 2 1 100 22 ハンバーグ 2 2 100 惜しいが失敗した例 和食、洋食の小計を入れつつ、順番も保持する select (id/10)*10 as id, (select name from test where id=(id/10)*10) as name, cat, 0 as menu, sum(price) as price from test group by cat union all select id, name, cat, menu, price from test where menu!=0 order by id; id name cat menu pric ---- ------------- ---- ---- ---- 10 和食 1 0 200 11 そば 1 1 100 12 うどん 1 2 100 20 和食 2 0 200 ←洋食になっていないため失敗 21 オムライス 2 1 100 22 ハンバーグ 2 2 100 失敗例 select id, name, cat, menu, sum(price) as price from test group by cat union all select id, name, cat, menu, price from test where menu!=0 order by id; id name cat menu pric ---- ------------- ---- ---- ---- 11 そば 1 1 100 12 うどん 1 2 200 12 うどん 1 2 100 21 オムライス 2 1 100 22 ハンバーグ 2 2 200 22 ハンバーグ 2 2 100 単純なgroup by とunionの組み合わせだと順番が不満でかつ合計された行の名前が和食、洋食にならない(group by がその最終行を見ているため?)。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

1

ベストアンサー

menuが0の場合のみpriceの計算を行う方法はどうでしょう。

sql

1select 2 id 3 , name 4 , cat 5 , menu 6 , case 7 when menu = 0 8 then ( 9 select 10 sum(price) 11 from 12 test tt 13 where 14 tm.cat = tt.cat 15 ) 16 else price 17 end price 18from 19 test tm;

投稿2015/09/07 01:47

sho_cs

総合スコア3541

true👍を押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

true

2015/09/07 02:31

素晴らしすぎます!実は同じ考え方でcase式ぶち込んでやってたんですけどそのなかでエイリアス名つけてやるところまで思い至りませんでした。。case式の理解が3歩くらい進んだ気持ちになりました。ありがとうございました!
true

2015/09/07 02:34

しかもunionもgroup byも要らないですね。恐れ入りました。。。

0

結局、集計したい行のidを大きくなるようにして、menuを0のままにして、表示するときにorder by menuとすることで無理やり実現させました。

和食のid 199 洋食 299 としたうえで、
select id, name, cat, menu, sum(price) as price from test group by cat union all selecct id, name, cat, menu, price form test where menu!=0 order by cat, menu;

あまり根本的な解決にはなっていませんがとりあえずこれでいっときます。

投稿2015/09/07 01:27

true

総合スコア440

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。