SQLを独学しています。(PostgreSQL9.6を学習用として利用)
職場でExcelデータの各集計表を作成しています。
環境はExcel2010、VBA(ADO)を利用しデータファイル(xlsx)から取得しています。
現在、クロス集計のSQL作成で行き詰ってしまいました。
データ量を減らしPostgreSQLでSQLの作成と動作確認を行っており
以下のテーブル情報で、記載するSQLの内容となっています。
最終的にはVBA上にSQLを移行しますが、これまで特に問題が発生してませんでしたが、
その点(PostgreからVBAへSQL移行)においてご指摘等も頂ければ幸いです。
### 前提・実現したいこと
実現したいことは、
データは、過去に催行した旅行でのアンケートデータで、
指定期間内で、旅行プラン毎に年代別の満足度集計をしたいです。
現在は、指定期間内でプラン毎の満足度集計までは出来ている(??)と思って
いるのですが、年代別も含めて集計するには、どこにどのようなSQL文が
必要となるでしょうか。
可能であれば、0件の年代も0値で取得したいです。
アドバイス等頂けるますようお願い致します。
### ソース等
CREATE TABLE "SS"."T_TEST_SQL_02"
(
q01_0001 integer, --Q01 満足 データ:0 or 1
q01_0002 integer, --Q01 やや満足 データ:0 or 1
q01_0003 integer, --Q01 やや不満 データ:0 or 1
q01_0004 integer, --Q01 不満 データ:0 or 1
q10_0010 integer, --Q10 利用年代 10 データ:0 or 1
q10_0020 integer, --Q10 利用年代 20 データ:0 or 1
q10_0030 integer, --Q10 利用年代 30 データ:0 or 1
q10_0040 integer, --Q10 利用年代 40 データ:0 or 1
q10_0050 integer, --Q10 利用年代 50 データ:0 or 1
q10_0060 integer, --Q10 利用年代 60 データ:0 or 1
q10_0070 integer, --Q10 利用年代 70 データ:0 or 1
q10_0080 integer, --Q10 利用年代 80 データ:0 or 1
trv_id character(3), --旅行プランID データ:'000'~'999'
trv_date character(10) --催行日 データ:'9999/99/99'
)
SELECT
SUM("前提条件"."満足") AS "満足件数"
,SUM("前提条件"."やや満足") AS "やや満足件数"
,SUM("前提条件"."やや不満") AS "やや不満件数"
,SUM("前提条件"."不満") AS "不満件数"
,"前提条件"."コースID"
FROM
(SELECT
q01_0001 AS "満足"
,q01_0002 AS "やや満足"
,q01_0003 AS "やや不満"
,q01_0004 AS "不満"
,q10_0010 AS "10代"
,q10_0020 AS "20代"
,q10_0030 AS "30代"
,q10_0040 AS "40代"
,q10_0050 AS "50代"
,q10_0060 AS "60代"
,q10_0070 AS "70代"
,q10_0080 AS "80代"
,trv_id AS "コースID"
FROM
"SS"."T_TEST_SQL_02"
WHERE
trv_date >= '2018/08/01'
AND trv_date <= '2018/08/31'
) AS "前提条件"
-- WHERE
-- "前提条件"."年代10" = 1
GROUP BY "前提条件"."プランID"
ORDER BY "前提条件"."プランID"
※データの持ち方ですが、
全ての回答欄がフィールドとして持っています。
Q01は、4択(満足~不満)ですが、選択された回答に「1」がたち、それ以外は「0」が
設定されてます。
Q10は、回答した年代の項目ですが、10代~80代までの8フィールドで保持しています
宜しくお願い致します。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
>可能であれば、0件の年代も0値で取得したいです。
以下は対応しているバージョンです。
CREATE TABLE "SS"."T_TEST_SQL_0X"
("年代" character(3))
INSERT INTO "SS"."T_TEST_SQL_0X"
VALUES('10代'), ('20代'), ('30代'), ('40代')
, ('50代'), ('60代'), ('70代'), ('80代')
SELECT Q.trv_id AS "プラン"
, X."年代"
, SUM(COALESCE(Q.q01_0001, 0)) AS "満足"
, SUM(COALESCE(Q.q01_0002, 0)) AS "やや満足"
, SUM(COALESCE(Q.q01_0003, 0)) AS "やや不満"
, SUM(COALESCE(Q.q01_0004, 0)) AS "不満"
FROM "SS"."T_TEST_SQL_0X" AS X
LEFT JOIN
(
SELECT T.trv_id
, CASE WHEN T.q10_0010 = 1 THEN '10代'
WHEN T.q10_0020 = 1 THEN '20代'
WHEN T.q10_0030 = 1 THEN '30代'
WHEN T.q10_0040 = 1 THEN '40代'
WHEN T.q10_0050 = 1 THEN '50代'
WHEN T.q10_0060 = 1 THEN '60代'
WHEN T.q10_0070 = 1 THEN '70代'
WHEN T.q10_0080 = 1 THEN '80代' END AS "年代"
, T.q01_0001
, T.q01_0002
, T.q01_0003
, T.q01_0004
FROM "SS"."T_TEST_SQL_02" AS T
WHERE T.trv_date BETWEEN '2018/08/01' AND '2018/08/31'
) AS Q ON X."年代" = Q.年代
GROUP BY Q.trv_id, X."年代"
ORDER BY Q.trv_id, X."年代"
No.3
- 回答日時:
訂正です。
>FROM SS.T_TEST_SQL_02 AS T
↓
FROM "SS"."T_TEST_SQL_02" AS T
PostgreSQL では、"" で囲まれていない識別子は、
大文字で書いても内部的に小文字に変換されてしまうので、
CREATE TABLE で作ったのと違うテーブルと見なされますので...
No.2
- 回答日時:
>可能であれば、0件の年代も0値で取得したいです。
以下は対応してないバージョンです。
SELECT Q.trv_id AS "プラン"
, Q."年代"
, SUM(Q.q01_0001) AS "満足"
, SUM(Q.q01_0002) AS "やや満足"
, SUM(Q.q01_0003) AS "やや不満"
, SUM(Q.q01_0004) AS "不満"
FROM (
SELECT T.trv_id
, CASE WHEN T.q10_0010 = 1 THEN '10代'
WHEN T.q10_0020 = 1 THEN '20代'
WHEN T.q10_0030 = 1 THEN '30代'
WHEN T.q10_0040 = 1 THEN '40代'
WHEN T.q10_0050 = 1 THEN '50代'
WHEN T.q10_0060 = 1 THEN '60代'
WHEN T.q10_0070 = 1 THEN '70代'
WHEN T.q10_0080 = 1 THEN '80代' END AS "年代"
, T.q01_0001
, T.q01_0002
, T.q01_0003
, T.q01_0004
FROM SS.T_TEST_SQL_02 AS T
WHERE T.trv_date BETWEEN '2018/08/01' AND '2018/08/31'
) AS Q
GROUP BY Q.trv_id, Q."年代"
ORDER BY Q.trv_id, Q."年代"
No.1
- 回答日時:
最終的に欲しい結果のサンプルを提示してください。
よろずやkinchan様
最終的には以下の結果になるようにしたいと考えています。
プラン|年代 |満足|やや満足|やや不満|不満 |
ーーー|ーーー|ーーー|----|----|---|
001 |10代 | 5 | 1 | 0 | 1 |
001 |20代 | 1 | 3 | 4 | 2 |
| :
|<中略>
| :
001 |70代 | 5 | 1 | 0 | 1 |
001 |80代 | 1 | 3 | 4 | 2 |
ーーー|ーーー|ーーー|----|----|---|
見づらくて申し訳ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
Access パラメータクエリをcsv...
-
SQLサーバから、項目の属性(型...
-
sqlで、600行あるテーブルを100...
-
副問合せの書き方について
-
エクセルの関数について教えて...
-
【MySQL】auto_incrementの値を...
-
期間の重複を調べるSQL文につい...
-
上位3位を求めるSQL文は?
-
Updateの複数テーブル条件時のL...
-
VBAでボタンをクリックする方法...
-
inner joinをすると数がおかし...
-
accessに対してSQL文を発行する...
-
select文のwhere句に配列を入れ...
-
WordpressのContact form 7でzi...
-
エラー 1068 (42000): 複数の主...
-
PL/SQLの変数について
-
MySQL NULLだけをカウントして...
-
VIEWの元のテーブルのindexって...
-
Sumで該当データがない場合
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
VIEWの元のテーブルのindexって...
-
副問合せの書き方について
-
select文のwhere句に配列を入れ...
-
マイクラPC版のコマンドで効率...
-
SQLサーバから、項目の属性(型...
-
エラー 1068 (42000): 複数の主...
-
[MySQL] 3つのテーブルの結合で...
-
Access パラメータクエリをcsv...
-
SQLにて特定の文字を除いた検索...
-
SQL Left Join で重複を排除す...
-
ストアドのエラーについて
-
Unionした最後にGROUP BYを追加...
-
バインド変数について
-
PL/SQLの変数について
-
sqlで、600行あるテーブルを100...
-
WordpressのContact form 7でzi...
-
selectした大量データをinsert...
-
inner joinをすると数がおかし...
おすすめ情報