#sql
Вопрос:
У меня есть несколько запросов с результатами всего по одному столбцу в каждом, и я хочу объединить их в таблицу. Пожалуйста, добавьте общий метод, так как у меня есть несколько запросов из разных таблиц, из которых мне нужно извлечь данные.
Пример:
Таблица X
ID | время | Тип |
---|---|---|
1 | 2021-07-01 | 1 |
2 | 2021-06-12 | 2 |
3 | 2021-06-02 | 1 |
4 | 2021-05-21 | 1 |
5 | 2021-04-01 | 1 |
6 | 2021-03-01 | 2 |
Таблица Y
ID | время | Тип |
---|---|---|
1 | 2021-07-01 | 1 |
2 | 2021-06-12 | 2 |
3 | 2021-06-02 | 3 |
4 | 2021-05-21 | 3 |
5 | 2021-04-01 | 1 |
6 | 2021-03-01 | 4 |
запрос 1
SELECT COUNT(*) FROM tableX AS A
WHERE A.type = 1
AND A.date BETWEEN '01-05-2021' AND '20-07-2021'
запрос 2
SELECT COUNT(*) FROM tableX AS B
WHERE B.type = 2
AND B.date BETWEEN '01-05-2021' AND '20-07-2021'
запрос 3 (пример)
SELECT COUNT(*) FROM tableY AS C
WHERE C.type = 3
AND C.date BETWEEN '01-03-2021' AND '20-07-2021'
Есть несколько запросов, которые я хочу получить в следующем формате:
запрос 1 | запрос 2 | запрос 3 |
---|---|---|
3 | 1 | 2 |
Комментарии:
1. Почему бы вам не использовать простое группирование по
2. Можете ли вы привести пример? Спасибо.
3. Сколько у вас таких столов?
4. У меня есть 5 в этом сценарии, и у меня может быть больше в будущих отчетах. Я ищу общий метод.
5. Если задействовано больше таблиц, лучше всего использовать переменную таблицы
Ответ №1:
В случае любых общих запросов вы можете объединить их таким образом и надеяться, что оптимизатор проделает хорошую работу по сокращению количества сканирований.
select
(...query1...) as query1,
(...query2...) as query2,
(...query3...) as query3;
т. е. с вашими запросами
select
(SELECT COUNT(*) FROM tableX AS A WHERE A.type = 1 AND A.date BETWEEN '01-05-2021' AND '20-07-2021') as query1,
(SELECT COUNT(*) FROM tableX AS B WHERE B.type = 2 AND B.date BETWEEN '01-05-2021' AND '20-07-2021') as query2,
(SELECT COUNT(*) FROM tableY AS C WHERE C.type = 3 AND C.date BETWEEN '01-03-2021' AND '20-07-2021') as query3;
В разделе Oracle вы должны добавить from dual
.
Редактировать
select t1.month_period as m, a, b, c, d, e, f
from
(values (11, 12, 1), (13, 14, 2)) as t1(a, b, month_period)
left join
(values (21, 22, 1), (23, 24, 2)) as t2(c, d, month_period)
on t1.month_period = t2.month_period
left join
(values (31, 32, 1), (33, 34, 2)) as t3(e, f, month_period)
on t1.month_period = t3.month_period;
values
Выражения обозначают примеры запросов. Результат:
m | a | b | c | d | e | f |
---|---|---|---|---|---|---|
1 | 11 | 12 | 21 | 22 | 31 | 32 |
2 | 13 | 14 | 23 | 24 | 33 | 34 |
Комментарии:
1. Спасибо, это почти то, что мне нужно. Однако Microsoft Server Management Studio возвращает ошибку, если я просто выбираю и добавляю запросы, поэтому я попросил подходящий метод для обобщения. Как я могу продолжить запрос?
2. Это прекрасно работает в Postgresql, SQLite и Oracle. В чем заключается ошибка, которую вы получаете? И вы не опускаете скобки, не так ли?
3. Сейчас это работает, у меня была неправильная пунктуация. Большое спасибо. Сможете ли вы представить общий метод извлечения нескольких строк за несколько периодов времени при выполнении одних и тех же запросов? Я также хотел бы создать новый столбец с периодом времени для каждой строки
4. Например, ежемесячная статистика с 12 строками за последние 12 месяцев
5. В этом случае вы должны
join
указать запросы вmonth
столбце «Период времени».
Ответ №2:
То, о чем вы просите, имеет очень мало смысла.
Вы можете это сделать:
SELECT type, count(type) FROM tableX
WHERE time between '2021-05-01' AND '2021-07-20'
GROUP BY type;
Чтобы получить это:
Тип | количество(тип) |
---|---|
1 | 3 |
2 | 1 |
Комментарии:
1. Причина, по которой я хотел использовать его в этом формате, заключается в том, что у меня есть несколько запросов для объединения из разных таблиц, а также потребуется несколько строк для этой конечной таблицы с разными интервалами времени. Когда вы даете мне его вот так, я не могу применить его, когда у меня есть другой запрос из другой таблицы.
2. Не могли бы вы, пожалуйста, дать свои запросы к другим таблицам? Это из-за того, что первый запрос пришел из tablex, а второй-из tabley?
Ответ №3:
Попробуйте следующее решение
SELECT SUM(case when type =1 and time BETWEEN '2021-05-01' AND '2021-07-20' THEN 1 else 0 end) AS query1,
SUM(case when type =2 and time BETWEEN '2021-05-01' AND '2021-07-20' THEN 1 else 0 end) AS query2
FROM tableX
Комментарии:
1. Можете ли вы также настроить его так, чтобы у меня было несколько периодов времени, и добавить больше строк в результат в соответствии с ними? Например, ежемесячные подсчеты за последние 12 месяцев
2. Кроме того, не могли бы вы обобщить, чтобы у меня там были и другие таблицы? На самом деле у меня есть много таблиц, которые хранятся не так, как они есть, а запросы для их создания в правильной форме.
3. Этот запрос является ответом на ваш вопрос. Мне нужна более подробная информация, чтобы ответить на ваш комментарий выше. Спасибо
Ответ №4:
Я надеюсь, что приведенный ниже запрос должен сделать
SELECT
A.type,
COUNT(*)
FROM
tableX AS A
WHERE
A.date BETWEEN '01-05-2021' AND '20-07-2021'
GROUP BY
A.type
Тип | считать |
---|---|
1 | 3 |
2 | 2 |
Комментарии:
1. Отредактировал запрос, чтобы проиллюстрировать, почему мне нужен именно этот формат. В конечном результате также будет больше строк для разных периодов, которые я установил, но до тех пор я ищу способ фактически отображать несколько SQL-запросов в отдельных столбцах, а не фиксировать один запрос. Когда их будет слишком много, эти трюки больше не будут работать. Не могли бы вы обновить запрос? Спасибо.
2. Как вы предоставляете несколько периодов? Может быть, с другого стола
3. Если задействовано слишком много и больше таблиц, вам придется вставить выходные данные в временную таблицу или переменную таблицы