SELECT несколько столбцов из подзапроса (помещены в подсказки SELECT) эффективно - PullRequest
0 голосов
/ 03 октября 2019

У меня есть 3 таблицы:

  1. TableA
  2. TableB
  3. TableC

Мне нужно выполнить несколько агрегатных функций(COUNT и SUM) по некоторым столбцам из них.

Я не нашел способа объединить их (даже с приведенным ниже столбцом ClientId), поэтому я попытался:

SELECT
(SELECT COUNT(*) FROM TableA 
WHERE ClientId = 2 AND IsDisabled != 1 AND IsDeleted != 1) AS ColumnName1, 
(SELECT COUNT(*) FROM TableB 
WHERE ClientId = 2 AND DisabledWhen IS NULL) AS ColumnName2,
(SELECT COUNT(*) FROM TableC
WHERE ClientId = 2 AND TDate >= CURRENT_TIMESTAMP -30) AS ColumnName3,
(SELECT SUM(TPrice + COALESCE (PPrice,0)) FROM TableC
WHERE ClientId = 2 AND TDate >= CURRENT_TIMESTAMP -30) AS ColumnName4; 

, и это работает, результат:

+--------------+-------------+-------------+--------------+
| ColumnName1  | ColumnName2 | ColumnName3 | ColumnName4  |
+--------------+-------------+-------------+--------------+
| 202          | 86          | 25          | 4574.0000    |    
+--------------+-------------+-------------+--------------+

но я хочу объединить последние два подзапроса в один подзапрос.

Итак, я попытался сделать это:

(SELECT COUNT(*) AS ColumnName3, SUM(TPrice + COALESCE (PPrice,0)) AS ColumnName4 FROM TableC
WHERE ClientId = 2 AND TDate >= CURRENT_TIMESTAMP -30);

но я получаю эту ошибку:

В списке выбора можно указать только одно выражение, если подзапрос не введен. EXISTS .

Как получить несколько столбцов из одного подзапроса?

и как эффективно выполнить вышеуказанный запрос?

1 Ответ

3 голосов
/ 03 октября 2019

Вы можете переместить запрос на TableC во внешний крайний выбор, оставив первые два подзапроса такими, какие они есть сейчас:

SELECT
    (SELECT COUNT(*) FROM TableA 
     WHERE ClientId = 2 AND IsDisabled != 1 AND IsDeleted != 1) AS ColumnName1, 
    (SELECT COUNT(*) FROM TableB 
    WHERE ClientId = 2 AND DisabledWhen IS NULL) AS ColumnName2,
    COUNT(*) AS ColumnName3,
    SUM(TPrice + COALESCE (PPrice, 0)) AS ColumnName4
FROM TableC
WHERE
    ClientId = 2 AND
    TDate >= CURRENT_TIMESTAMP - 30;

Это работает, потому что первые два подзапроса в основном рассматриваются как константы. Оставшаяся часть запроса будет работать только на TableC, что позволит нам выбрать несколько агрегатов.

...