#sql #sql-server #count
Вопрос:
У меня есть таблица в SQL server со значениями, как показано ниже-
Предмет | A | B | C | D | Дата |
---|---|---|---|---|---|
Р1 | ДА | НЕТ | ДА | NA | 20210801 |
Р2 | ДА | ДА | ДА | NA | 20210801 |
Р3 | ДА | ДА | НЕТ | НЕТ | 20210801 |
P4 | ДА | НЕТ | NA | НЕТ | 20210801 |
P5 | НЕТ | NA | НЕТ | ДА | 20210801 |
Р6 | NA | NA | ДА | НЕТ | 20210801 |
Р1 | ДА | НЕТ | ДА | NA | 20210901 |
Р2 | ДА | ДА | ДА | NA | 20210901 |
Р3 | НЕТ | НЕТ | ДА | NA | 20210901 |
P4 | ДА | НЕТ | NA | НЕТ | 20210901 |
P5 | НЕТ | NA | НЕТ | ДА | 20210901 |
Р6 | NA | NA | ДА | НЕТ | 20210901 |
Мне нужно количество значений каждой строки(Да, нет, NA) для каждого столбца, как показано ниже. Имена столбцов будут значениями строк.
Источник | ДА | НЕТ | NA | Дата |
---|---|---|---|---|
A | 3 | 2 | 1 | 20210901 |
B | 1 | 3 | 2 | 20210901 |
C | 4 | 1 | 1 | 20210901 |
D | 1 | 2 | 3 | 20210901 |
Код будет выполняться с определенным значением в предложении where для столбца даты (например, ГДЕ Дата =’20210901′)
Пожалуйста, помогите мне достичь этого.
Комментарии:
1. Вопрос, который у меня есть, заключается в том, с чем вы будете запускать код и что будет использовать данные в конечном продукте. Будут ли это прямые запросы к базе данных? или, может быть, какое-нибудь приложение на C#? Питон? и т.д. Причина, по которой я спрашиваю, заключается в том, что для всех языков существуют другие решения (например, Dapper) для достижения этой цели. Но если вы хотите получить данные из одной таблицы и получить их в определенном формате, то ответ Гордона, судя по тому, что я вижу, в порядке.
2. @KrzysiekMastalerz В базе данных SQL Server — Используя процедуру хранения, я хочу обновить 2-ю таблицу, используя данные в 1-й таблице. Спасибо вам за ваш ответ. Что касается ответа Гордона, я пытаюсь понять и попробовать, так как я не знаю, как именно работает unpivot.
3. ссылка — Здесь вы можете найти некоторые ответы относительно перекрестной функции.
Ответ №1:
Один из методов состоит в том, чтобы отказаться от использования apply
и агрегировать:
select t.source, t.date, v.*
from t cross apply
(select sum(case when x = 'Yes' then 1 else 0 end) as num_yes,
sum(case when x = 'No' then 1 else 0 end) as num_no,
sum(case when x = 'NA' then 1 else 0 end) as num_na
from (values (a), (b), (c), (d)) v(x)
) v;