SQL Server — Как подсчитать количество значений в нескольких столбцах и вставить в другую таблицу со значениями строк в виде столбцов и столбцов в виде значений строк

#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;