SQL Количество столбцов из других столбцов - PullRequest
1 голос
/ 24 января 2020

Я сгенерировал это представление после использования LEFT JOIN для 2 таблиц (упрощенный пример).

Таблицы:

T1: Id, ...other columns not used
+----+-----+
| Id | ... |
+----+-----+
| 1  | ... |
| 2  | ... |
+----+-----+
T2: Id, NewId (Foreign Key from T1), Status, ...other columns not used
+-----+-------+--------+-----+
| Id  | NewId | Status | ... |
+-----+-------+--------+-----+
| 1   | 1     | 1      | ... |
| 2   | 1     | 2      | ... |
| 3   | 1     | 2      | ... |
| 4   | 1     | 3      | ... |
| 5   | 1     | 1      | ... |
| 6   | 1     | 1      | ... |
| 7   | 2     | 0      | ... |
| 8   | 2     | 2      | ... |
| 9   | 2     | 1      | ... |
| 10  | 2     | 2      | ... |
+-----+-------+--------+-----+

Текущее представление:

SELECT
  T1.Id,
  T2.Status
FROM T1
LEFT JOIN T2 ON T1.Id = T2.NewId;

Представление: (до меня дошло)

+----+--------+
| Id | Status |
+----+--------+
| 1  | 1      |
| 1  | 2      |
| 1  | 2      |
| 1  | 3      |
| 1  | 1      |
| 1  | 1      |
| 2  | 0      |
| 2  | 2      |
| 2  | 1      |
| 2  | 2      |
+----+--------+

Требуемое представление должно иметь отдельные столбцы для каждого значения состояния (которые в точности равны 0, 1, 2 или 3). 0 и 1 хранятся в одном столбце.

Обязательный вид: (но мне это нужно)

+----+------------+----------+----------+
| Id | Status 0/1 | Status 2 | Status 3 |
+----+------------+----------+----------+
| 1  | 1          | 1        | 1        |
| 2  | 2          | 2        | 2        |
+----+------------+----------+----------+

Мне кажется, что я что-то упустил из основы c , Как я могу получить это представление?

Я не думаю, что нам нужны вещи Rank (), и это большой запрос к 4 нормализованным таблицам (на практике), поэтому мне нужно оптимальное решение. Подзапросы работают со встроенными SELECT запросами , но им также необходимо JOIN s. Производственное требование имеет 10 столбцов для подсчета более 2 отдельных столбцов.

Ответы [ 2 ]

3 голосов
/ 24 января 2020

Использовать условное агрегирование:

select
    id,
    sum(case when status in (0, 1) then 1 else 0 end) status_0_1,
    sum(case when status = 2 then 1 else 0 end) status_2
    sum(case when status = 3 then 1 else 0 end) status_3
from mytable
group by id

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

select
    t1.id,
    sum(case when t2.status in (0, 1) then 1 else 0 end) status_0_1,
    sum(case when t2.status = 2 then 1 else 0 end) status_2
    sum(case when t2.status = 3 then 1 else 0 end) status_3
from t1
left join t2 on t1.id = t2.newid
group by t1.id
1 голос
/ 24 января 2020

Использование агрегации:

select id,
       sum(case when status in (0, 1) then 1 else 0 end) as status_01,
       sum(case when status = 2 then 1 else 0 end) as status_2,
       sum(case when status = 3 then 1 else 0 end) as status_3
from t
group by id;

Вы должны иметь возможность встроить это непосредственно в left join:

from a left join
     b
     on . . . 

Может быть предложением from. Или используйте текущий запрос в качестве подзапроса или CTE.

...