SQL Несколько запросов к разным столбцам

#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. Если задействовано слишком много и больше таблиц, вам придется вставить выходные данные в временную таблицу или переменную таблицы