#sql #sql-server #tsql
#sql #sql-сервер #tsql
Вопрос:
Я хочу запросить что-то вроде этого.
SELECT
COLUMN_ID,
(SELECT COUNT() WHERE ID = the current row COLUMN_ID WHERE status = 1) as column2,
(SELECT COUNT() WHERE ID = the current row COLUMN_ID WHERE status = 2) as column 3
Как можно сделать, чтобы количество выбранных использовалось в качестве столбца, динамического в зависимости от значения COLUMN_ID в каждой строке
Образец данных для запроса:
| Column id | status |
--------------------- ------------------
| 0001 | 1 |
| 0001 | 2 |
| 0001 | 1 |
| 0002 | 1 |
Пример вывода
| Column id | status 1 | status 2 |
--------------------- ------------------ ------------------
| 0001 | 2 | 1 |
| 0002 | 1 | 0 |
Комментарии:
1. Да, это, вероятно, возможно. Пожалуйста, покажите нам образцы данных и ожидаемый результат, чтобы мы могли придумать соответствующий ответ.
2.
COLUMN_ID
Значение может появляться в таблице несколько раз или оно уникально?3. @Shawn это уникально
4. Но
ID
в одной строке может быть равноCOLUMN_ID
другой строке, и в ней могут быть дубликаты? Или этоID
в другой таблице?5. В вашем примере таблицы нет столбца id, только идентификатор столбца и статус… И идентификатор столбца не уникален, как вы сказали…
Ответ №1:
Вы можете использовать SUM с предложением CASE WHEN
SELECT
COLUMN_ID,
SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) as column2,
SUM(CASE WHEN status = 2 THEN 1 ELSE 0 END) as column3
FROM TABLE
GROUP BY COLUMN_ID
Другой метод
SELECT DISTINCT
COLUMN_ID,
SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) OVER(PARTITION BY COLUMN_ID) as column2,
SUM(CASE WHEN status = 2 THEN 1 ELSE 0 END) OVER(PARTITION BY COLUMN_ID) as column3
FROM TABLE
Комментарии:
1. в принципе, я хочу выбрать все идентификаторы, затем для каждого идентификатора строка столбца будет запрашивать, где id = rowid
2. Вы пробовали этот запрос?? Предложение GROUP BY сделает это. И СУММА СЛУЧАЙ, КОГДА будет делать то же самое, что и COUNT с условием
3. @kev_m можете ли вы предоставить образец данных с ожидаемым результатом. ваш вопрос неясен
4. @kev_m тогда вы ищете тот же запрос, который я предоставил.
5. Учитывая примерные данные, для меня это выглядит как правильный ответ!