используйте select в качестве столбца, где id равен идентификатору строки SQL

#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. Учитывая примерные данные, для меня это выглядит как правильный ответ!