準・究極の選択

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件)

>可能であれば、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."年代"
    • good
    • 0

訂正です。



>FROM SS.T_TEST_SQL_02 AS T

FROM "SS"."T_TEST_SQL_02" AS T

PostgreSQL では、"" で囲まれていない識別子は、
大文字で書いても内部的に小文字に変換されてしまうので、
CREATE TABLE で作ったのと違うテーブルと見なされますので...
    • good
    • 0

>可能であれば、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."年代"
    • good
    • 0

最終的に欲しい結果のサンプルを提示してください。

    • good
    • 0
この回答へのお礼

よろずや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  |
ーーー|ーーー|ーーー|----|----|---|


見づらくて申し訳ありません。

お礼日時:2018/11/18 22:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す


おすすめ情報