-
Есть таблица, tVal, поля Id int, AName char(10), SName char(10), Val int значения примерно такие (без id) Adaeva Natalya IS_KR_SG 1 Adaeva Natalya IS_KR_MSP_SG 0 Alesova Ludmila IS_ML_SG 0 Alesova Ludmila IS_CH_SG 1 Alyamkina Marina SIS_UL_SG 1 Alyamkina Marina SIS_UD_SG 0 ... смысл такой Опертор (AName) зарегистрирован (Val) в службе (SName) Val = 0 зарегистрирован, но не активен Val = 1 зарегистрирован и активен нет пары AName-SName - не зарегистрирован хочу получить таблицу
служба1 служба2 служба3
оператор1 nul 0 1
оператор2 1 0 nul
оператор3 nul nul 1
....
циклами по датасету сделал, а теперь хочу одним запросом. как?
-
SUM(CASE ... WHEN ...)
Это ANSI SQL
-
пример для oracle где-то такой: WITH tab AS (
SELECT 'Adaeva Natalya' AS aname,'IS_KR_SG' AS sname,1 AS val FROM dual
UNION ALL
SELECT 'Adaeva Natalya' AS aname,'IS_KR_MSP_SG' AS sname,0 AS val FROM dual
UNION ALL
SELECT 'Alesova Ludmila' AS aname,'IS_ML_SG' AS sname,1 AS val FROM dual
UNION ALL
SELECT 'Alesova Ludmila' AS aname,'IS_CH_SG' AS sname,0 AS val FROM dual
)
SELECT aname,
SUM(CASE WHEN sname = 'IS_KR_SG' THEN VAL ELSE 0 END) IS_KR_SG,
SUM(CASE WHEN sname = 'IS_KR_MSP_SG' THEN VAL ELSE 0 END) IS_KR_MSP_SG,
SUM(CASE WHEN sname = 'IS_ML_SG' THEN VAL ELSE 0 END) IS_ML_SG,
SUM(CASE WHEN sname = 'IS_CH_SG' THEN VAL ELSE 0 END) IS_CH_SG
FROM tab
GROUP BY aname
-
> [1] Игорь Шевченко © (09.02.11 15:04) > SUM(CASE ... WHEN ...)
А не кросс автору надо?
-
> А не кросс автору надо?
ты изъясняйся понятно, если не трудно
-
Inovet © нет.
Игорь Шевченко © (09.02.11 15:12) [2] правильно, так подумал потом но у меня не известно заранее, ни размер по X, ни по Y т.е. Операторы и службы - обе величины динамические
-
для MSSQL не особо отличается SELECT AName, SUM(CASE WHEN SName = 'IS_KR_SG' THEN VAL ELSE NULL END) AS IS_KR_SG, SUM(CASE WHEN sname = 'IS_KR_MSP_SG' THEN VAL ELSE NULL END) AS IS_KR_MSP_SG, SUM(CASE WHEN sname = 'IS_ML_SG' THEN VAL ELSE NULL END) AS IS_ML_SG, SUM(CASE WHEN sname = 'IS_CH_SG' THEN VAL ELSE NULL END) AS IS_CH_SG FROM tVal GROUP BY AName
> т.е. Операторы и службы - обе величины динамические операторы пофиг (в [2] операторы фигурируют только затем чтобы реальную таблицу не создавать, в mssql это подзапрос), т.к. по ним группировка, а из-за служб придется динамически запрос формировать.
> А не кросс автору надо? скорее всего оно и есть
-
> придется динамически запрос формировать. хотя... может в старших версиях mssql уже ввели pivot table как в акцессе... тогда может и не придется. (у меня просто 2000й)
-
как получить таблицу-матрицу запросом в MSSQL я не знаю, но для отображения (а для чего еще, не представляю), можно девэекспересс или фастрепорт использовать, и там, и там все по нонешним временам грамотно в этом плане.
-
> [4] Игорь Шевченко © (09.02.11 16:10) > > А не кросс автору надо? > > ты изъясняйся понятно, если не трудно
Вот об этом
> [5] Гость (09.02.11 16:27) > но у меня не известно заранее, ни размер по X, ни по Y
Кросс-таблица. Ну и правильно уже заметили, что такое обычно бывает надо для просмотра или печати, значит и средства можно использовать специальные ФР, например.
-
sniknik © (09.02.11 16:34) [7] Не как в акцессе еще не придумали. есть pivot но надо явно указывать колонки.
-
Inovet © (10.02.11 05:17) [9] пишите хранимку которая будет строить динамический запрос и выполнять его. Т.е. то что написал sniknik © (09.02.11 16:32) [6] только должна запихнуть ваша хранимка в текстовую переменную, которую потом запустить на выполнение.
-
> Не как в акцессе еще не придумали. вообще то есть начиная с 2005 если верить msdn.
-
-
sniknik © (10.02.11 17:51) [13] Да сделали, но как я понял там фиксированное количество столбцов. т.е. в акцессе, на этапе построения запроса я не указываю количество столбцов, а тут приходится указывать и давать им названия.
-
> а тут приходится указывать и давать им названия. не приходится. можно. в акцессе аналогично, можно давать, можно нет.
-
sniknik © (11.02.11 14:21) [15] У меня чего-то не получилось не указывать. Мог конечно не разобраться.
-
сделал примерно как Игорь Шевченко © (09.02.11 15:12) [2] советовал
только сначала select distinct SNAME пришлось спросить, потом курсор открыть для формирования запроса, а потом его запускать.
А начальник смешнее сделал - он в excel мою портянку загнал, и как-то там в 3 клика получил что надо :)
Учите люди Excel...
-
Гость (15.02.11 09:18) [17] >он в excel мою портянку загнал Называется сводная таблица.
|