Структура таблицы данных:
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).
Я хочу показать информацию в DBGrid :)


Используйте характеристическую или дельта-функцию:
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) на основе вашей таблицы, а также отдельных значений идентификаторов.
Добавьте группу по годам для полноты.
если X - это значение идентификатора, которое вы ищете, вы бы сделали это примерно так.
select (select count(*) where id1 = X) as countid1 ... etc
Выбрать
(выберите count (id1) из t1, где id1 = @param) как id1,
(выберите count (id2) из t2, где id2 = @param) как id2
Если ваша таблица не проиндексирована индивидуально, за исключением столбцов id и разреженных, версия характеристической функции (которая была отклонена) в большинстве случаев будет превосходить ее, поскольку при этом будет выполняться несколько сканирований таблицы.
Это кажется лучшим решением (от Вики):
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
по какой причине вы можете сделать только один запрос? Для меня много проще, если вы просто использовали 4 запроса count (*) и собрали итоги в коде.