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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

2回答

3395閲覧

sqlで合計を出したいのですが

samazama4623

総合スコア59

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

1クリップ

投稿2015/05/18 06:13

lang

1SELECT 2 TO_CHAR(to_date,'yyyy/mm/dd') as date 3 ,extract(dow from to_date) 4 ,(array['(日)','(月)','(火)','(水)','(木)','(金)','(土)'])[extract(dow from to_date) + 1] as days 5 ,t1.raizyou 6 ,t1.taizai 7 ,t1.taizyou 8 ,SUM( 9 COALESCE(t1.taizai,0)+COALESCE(t1.taizyou,0) 10 ) as souraizyou 11 ,SUM( 12 COALESCE(t1.taizai,0)+COALESCE(t1.taizyou,0) 13 ) as total 14 15 FROM ( 16 SELECT 17 to_date 18 ,SUM(CASE WHEN in1 > 0 THEN 1 END) as raizyou 19 ,SUM(CASE WHEN in1 >= 1 AND out1 = 0 THEN 1 END ) as taizai 20 ,SUM(CASE WHEN out1 > 0 THEN 1 END ) as taizyou 21 22 FROM ( 23 SELECT e_id,to_date(come_date,'yyyy/mm/dd'), 24 SUM(CASE WHEN come_place='OK' THEN 1 ELSE 0 END) AS in1 25 ,SUM(CASE WHEN come_place='NG' THEN 1 ELSE 0 END) AS out1 26 FROM table 27 GROUP BY e_id,to_date(come_date,'yyyy/mm/dd') 28 ORDER BY to_date 29 )as t2 30 GROUP BY to_date 31 ORDER BY to_date 32 ) as t1 33GROUP BY to_date,raizyou,taizai,taizyou 34ORDER BY date

上記のSQLでは
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
|date | ~ | ~ | total |
|2015/05/19| 12 | 2 | 1000 |
|2015/05/20| 23 | 2 | 2000 |
となるのですが
全日程の合計を出したい場合はどうすればよいですか?
この場合は3000の値です
副問い合わせをまたネストしていけばよろしいですか
他に簡単な方法があれば教えてください

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

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

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

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

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

miyamoto0105

2015/05/18 06:33

tableのテーブル構成がわかると、もう少しわかるのですが、、、   UNIONしてSUMしても出来ますし、普通に副問い合わせ増やしてもいいと思います。あまり副問い合わせを増やすと可読性が下がるので一時テーブルに格納するのもありと思います。
samazama4623

2015/05/18 06:54

tableにはcome_dateという列があります
guest

回答2

0

ベストアンサー

確かに「table」と記載のあるテーブル構造とデータ例がないとなんとも、、ですね。

「全日程の合計」を最終行に1行出したいのなら、言語側で、
$all_total = $all_total + $total;
と集計して、$all_totalを表示させた方が、簡単でよいと思います。

投稿2015/05/18 13:04

SaintKnowledge

総合スコア368

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

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

0

上のSQLで

lang

1--------------------------- 2|date | ~ | ~ | total | 3|2015/05/19| 12 | 2 | 1000 | 4|2015/05/20| 23 | 2 | 2000 | 5

とはならないので、質問の意図が分かりませんよ。
まず、テーブル構造、次にサンプルデータ、欲しい結果。
参考に、今、トラブっているSQL
となってる方が答えやすいです。

ARRAYや、日付の型変換はとりあえず集計に関係ないから外した方が良いです。

例えば、以下の様に

■テーブル構造
table -- 質問とはいえ、予約語は避けた方が良いでしょう。
-- 型もあった方が良いですが
e_id -- 来場ID ※ 2回目の来場では同じ顧客でも違うID
, date -- 対象日付
, come_place -- ON のとき来場したか、来場中、OFFのとき退場した

e_id と date でユニーク

※ 素直に、come_place を 来場、滞在中、退場 にした方が良いかも。
それとも、滞在中はレコードがない?
考慮すべき点が多すぎて、回答ができないわけです。

■期待する結果

lang

1----------------------------------- 2|date | raizyou | taizai | taizyou | total 3|2015/05/19| 200 | 500 | 500 | 700 4|2015/05/20| 300 | 100 | 600 | 400 5

と出力したい?

lang

1--------------------------------------- 2|date | raizyou | taizai | taizyou | amount | total 3|2015/05/19| 200 | 500 | 500 | 700 | 1100 4|2015/05/20| 300 | 100 | 600 | 400 | 1100 5

と出力したい?

投稿2015/05/18 09:27

編集2015/05/18 09:31
kantomi

総合スコア295

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問