Возможно ли иметь два подзапроса в предложении from? - PullRequest
0 голосов
/ 11 ноября 2019

Я пишу этот запрос, который должен учитывать два типа данных из одной таблицы, но с разными свойствами.

Я уже пытался добавить «И» и «,» между подзапросами, но это не работает этими способами.

SELECT COUNT(sb1.prop) AS PROP1, COUNT(sb2.prop) AS PROP2
FROM (SELECT * FROM TABLE t WHERE t.prop LIKE '%SOMETHING%') AS sb1
      AND/,/WHATEVER WORKS
     (SELECT * FROM TABLE t WHERE t.prop LIKE '%SOMETHING ELSE%') AS sb2

Мне нужно посчитать, сколько записей имеют реквизит, например ЧТО-ТО и ЧТО-ТО ЕЩЕ , как можноЯ делаю это с двумя подзапросами в одном запросе из предложения? У меня есть ошибки типа " ошибка арифметического переполнения при преобразовании выражения в тип данных числовой "

Ответы [ 2 ]

2 голосов
/ 11 ноября 2019

Я думаю, что вы можете использовать условное агрегирование здесь:

select
    sum(case when prop like '%SOMETHING%' then 1 end) sb1,
    sum(case when prop like '%SOMETHING ELSE%' then 1 end) sb2
from mytable

Примечание: при данной текущей настройке вещи, которые соответствуют '%SOMETHING%', будут учитываться один раз в каждом sum() (но я могу только представить,что это гипотетические данные и фильтр).

1 голос
/ 11 ноября 2019

То, что вы выглядите для описания, таково:

SELECT COUNT(sb1.prop) AS PROP1,
       COUNT(sb2.prop) AS PROP2
FROM (SELECT * FROM TABLE t WHERE t.prop LIKE '%SOMETHING%') AS sb1
     CROSS APPLY (SELECT * FROM TABLE t WHERE t.prop LIKE '%SOMETHING ELSE%') AS sb2;

Это, однако, не вернет результаты, к которым вы стремитесь (и PROP1, и PROP2 будутимеют одинаковое значение). То, что приведено выше, фактически совпадает с:

SELECT COUNT(*) AS PROP1,
       COUNT(*) AS PROP2
FROM TABLE t1
     CROSS JOIN TABLE t2
WHERE t1.prop LIKE '%SOMETHING%'
  AND t2.prop LIKE '%SOMETHING ELSE%';

Это можно решить, выполнив агрегацию в подзапросе:

SELECT (SELECT COUNT(*) FROM TABLE t WHERE t.prop LIKE '%SOMETHING%') AS PROP1,
       (SELECT COUNT(*) FROM TABLE t WHERE t.prop LIKE '%SOMETHING ELSE%') AS PROP2;

Однако, учитывая, что это одна и та же таблица, вам лучше использовать агрегат условий:

SELECT COUNT(CASE WHEN t.prop LIKE '%SOMETHING%' THEN 1 END) AS PROP1,
       COUNT(CASE WHEN t.prop LIKE '%SOMETHING ELSE%' THEN 1 END) AS PROP2
FROM TABLE t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...