🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SQLite

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

Q&A

解決済

2回答

4877閲覧

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

true

総合スコア440

SQLite

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

0グッド

0クリップ

投稿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 がその最終行を見ているため?)。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

2015/09/07 02:31

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

2015/09/07 02:34

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問