Сводный запрос из нескольких полей в SQL

Структура таблицы данных:
id1, id2, id3, id4, ... (некоторые другие поля) .
Я хочу создать сводный запрос, чтобы узнать, сколько раз какое-либо значение идентификатора используется в каждом столбце.

Данные
1,2,3,4,2008
2,3,5,1,2008
1,3,2,5,2007
1,2,3,6,2007
3,1,2,5,2007

Для значения 1 результат должен быть
1,0,0,1,2008
2,1,0,0,2007

Как сделать это одним запросом (в MySQL).

по какой причине вы можете сделать только один запрос? Для меня много проще, если вы просто использовали 4 запроса count (*) и собрали итоги в коде.

hometoast 09.12.2008 22:38

Я хочу показать информацию в DBGrid :)

Riho 09.12.2008 23:05
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
2 121
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Используйте характеристическую или дельта-функцию:

DECLARE @look_for AS int
SET @look_for = 1

SELECT SUM(CASE WHEN id1 = @look_for THEN 1 ELSE 0 END) AS id1_count
    ,SUM(CASE WHEN id2 = @look_for THEN 1 ELSE 0 END) AS id2_count
    ,SUM(CASE WHEN id3 = @look_for THEN 1 ELSE 0 END) AS id3_count
    ,SUM(CASE WHEN id4 = @look_for THEN 1 ELSE 0 END) AS id4_count
FROM tbl

Есть способы генерировать это с помощью кода (также метод, использующий PIVOT и UNPIVOT в SQL Server, который не является ANSI) на основе вашей таблицы, а также отдельных значений идентификаторов.

Добавьте группу по годам для полноты.

jason saldo 09.12.2008 23:39

если X - это значение идентификатора, которое вы ищете, вы бы сделали это примерно так.

select (select count(*) where id1 = X) as countid1 ... etc

Выбрать

(выберите count (id1) из t1, где id1 = @param) как id1,

(выберите count (id2) из ​​t2, где id2 = @param) как id2

Если ваша таблица не проиндексирована индивидуально, за исключением столбцов id и разреженных, версия характеристической функции (которая была отклонена) в большинстве случаев будет превосходить ее, поскольку при этом будет выполняться несколько сканирований таблицы.

Cade Roux 09.12.2008 23:00
Ответ принят как подходящий

Это кажется лучшим решением (от Вики):

select years,
sum(1*(1-abs(sign(id1-56)))) as id1,
sum(1*(1-abs(sign(id2-56)))) as id2,
sum(1*(1-abs(sign(id3-56)))) as id3,
sum(1*(1-abs(sign(id4-56)))) as id4,
from mytable
group by years

Другие вопросы по теме