Несколько отдельных классов WHERE в одном представлении - PullRequest
1 голос
/ 09 июля 2020

Мне нужна помощь в создании одного оператора SELECT как части оператора CREAT VIEW, который содержит несколько отдельных требований к фильтрации или группировке.

Я работаю над базой данных SQLite, чтобы отслеживать использование нашей местной кладовой с едой, где у нас есть два типа посетителей, «запланированные» или «входящие», приходящие в разные дни. Одна из центральных таблиц - это таблица «visit_log», которая отслеживает каждое посещение по дате, времени, типу посещения и людям в семье.

Я пытаюсь создать ВИД, который суммирует этот «visit_log» сгруппированы по visit_date, а также для количества записей и SUM размера домохозяйства, с отображением количества «Drop-Ins», количества «Scheduled» и суммы двух типов.

Вот «Visit_log»

CREATE TABLE "visit_log" ("visit_date" DATE, "visit_time" TIME, "client_relation" TEXT, "household_size" INTEGER)

Вот пример содержимого таблицы «visit_log». (Мы еще не начали записывать visit_time, поэтому эти значения пусты.)

"visit_date","visit_time","client_relation","household_size"
"6/9/20","","Scheduled","1"
"6/9/20","","Scheduled","1"
"6/9/20","","Drop-In","2"
"6/9/20","","Drop-In","3"
"6/9/20","","Drop-In","8"
"6/9/20","","Drop-In","5"
"6/16/2020","","Scheduled","1"
"6/16/2020","","Scheduled","1"
"6/16/2020","","Drop-In","4"
"6/16/2020","","Drop-In","5"
"6/16/2020","","Drop-In","2"
"6/16/2020","","Drop-In","2"
"6/16/2020","","Drop-In","5"
"6/16/2020","","Drop-In","1"

Я могу создать три отдельных VIEW, по одному для каждого типа и один для двух вместе. Но моя цель - объединить результаты этих трех ПРОСМОТРОВ.

Вот три ПРОСМОТРА. Первый - для двух типов клиентов вместе.

CREATE VIEW "visit_summary" AS SELECT
visit_date,
COUNT (*) AS households_total,
SUM (household_size) AS individuals_total 
FROM 
"visit_log"
GROUP By visit_date

Это дает

"visit_date","households_total","individuals_total"
"06/09/2020","12","44"
"06/16/2020","8","21"
"06/23/2020","7","20"
"06/30/2020","10","22"
"07/07/2020","7","18"

Далее идет ПРОСМОТР для Drop-Ins

CREATE VIEW "visit_summary_dropin" AS SELECT
visit_date,
COUNT (*) AS households_dropin,
SUM (household_size) AS individuals_dropin
FROM 
"visit_log"
WHERE client_relation = "Drop-In"
GROUP By visit_date

Это дает

"visit_date","households_dropin","individuals_dropin"
"06/09/2020","10","42"
"06/16/2020","6","19"
"06/23/2020","4","13"
"06/30/2020","6","12"
"07/07/2020","6","16"

Наконец, это ПРОСМОТР для запланированного

CREATE VIEW "visit_summary_scheduled" AS SELECT
visit_date,
COUNT (*) AS households_schedualed,
SUM (household_size) AS individuals_scheduled 
FROM 
"visit_log"
WHERE client_relation = "Scheduled"
GROUP By visit_date

Это дает

"visit_date","households_schedualed","individuals_scheduled"
"06/09/2020","2","2"
"06/16/2020","2","2"
"06/23/2020","3","7"
"06/30/2020","4","10"
"07/07/2020","1","2"

То, что я надеюсь создать, - это единственный ПРОСМОТР, который дает

    "visit_date","households_total","individuals_total","households_dropin","individuals_dropin","households_schedualed","individuals_scheduled"
"06/09/2020","12","44","10","42","2","2"

и т. Д.

Итак, мой главный вопрос, наконец, заключается в том, как создать один VIEW, содержащий что-то вроде нескольких классов WHERE для определения разных столбцов?

1 Ответ

0 голосов
/ 09 июля 2020

Вы можете сделать это с помощью условного агрегирования:

CREATE VIEW visit_summary_scheduled_all AS 
SELECT visit_date,
  COUNT(*) households_total,
  SUM(household_size) individuals_total,
  SUM(client_relation = 'Drop-In') households_dropin,
  SUM(CASE WHEN client_relation = 'Drop-In' THEN household_size END) individuals_dropin,
  SUM(client_relation = 'Scheduled') households_scheduled,
  SUM(CASE WHEN client_relation = 'Scheduled' THEN household_size END) individuals_scheduled 
FROM visit_log
GROUP By visit_date

См. демонстрацию . Результатов:

| visit_date | households_total | individuals_total | households_dropin | individuals_dropin | households_scheduled | individuals_scheduled |
| ---------- | ---------------- | ----------------- | ----------------- | ------------------ | -------------------- | --------------------- |
| 6/16/2020  | 8                | 21                | 6                 | 19                 | 2                    | 2                     |
| 6/9/20     | 6                | 20                | 4                 | 18                 | 2                    | 2                     |
...