![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите как получить таблицу-матрицу запросом в MSSQL
Гость © (2011-02-09 14:48:00)Есть таблица, 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
....
циклами по датасету сделал, а теперь хочу одним запросом.
как?
stas (2011-02-16 17:28:00) [1]Гость (15.02.11 09:18) [17]
>он в excel мою портянку загнал
Называется сводная таблица.
Гость (2011-02-15 09:18:00) [2]сделал примерно как Игорь Шевченко © (09.02.11 15:12) [2] советовал
только сначала select distinct SNAME пришлось спросить, потом курсор открыть для формирования запроса, а потом его запускать.
А начальник смешнее сделал - он в excel мою портянку загнал, и как-то там в 3 клика получил что надо :)
Учите люди Excel...
stas (2011-02-11 14:31:00) [3]sniknik © (11.02.11 14:21) [15]
У меня чего-то не получилось не указывать. Мог конечно не разобраться.
sniknik (2011-02-11 14:21:00) [4]> а тут приходится указывать и давать им названия.
не приходится. можно. в акцессе аналогично, можно давать, можно нет.
stas (2011-02-11 14:13:00) [5]sniknik © (10.02.11 17:51) [13]
Да сделали, но как я понял там фиксированное количество столбцов.
т.е. в акцессе, на этапе построения запроса я не указываю количество столбцов, а тут приходится указывать и давать им названия.
sniknik (2011-02-10 17:51:00) [6]http://msdn.microsoft.com/en-us/library/ms177410%28v=SQL.90%29.aspx
sniknik (2011-02-10 17:49:00) [7]> Не как в акцессе еще не придумали.
вообще то есть начиная с 2005 если верить msdn.
stas (2011-02-10 17:39:00) [8]Inovet © (10.02.11 05:17) [9]
пишите хранимку которая будет строить динамический запрос и выполнять его. Т.е. то что написал sniknik © (09.02.11 16:32) [6]
только должна запихнуть ваша хранимка в текстовую переменную, которую потом запустить на выполнение.
stas (2011-02-10 17:37:00) [9]sniknik © (09.02.11 16:34) [7]
Не как в акцессе еще не придумали. есть pivot но надо явно указывать колонки.
Inovet (2011-02-10 05:17:00) [10]> [4] Игорь Шевченко © (09.02.11 16:10)
> > А не кросс автору надо?
>
> ты изъясняйся понятно, если не трудно
Вот об этом
> [5] Гость (09.02.11 16:27)
> но у меня не известно заранее, ни размер по X, ни по Y
Кросс-таблица. Ну и правильно уже заметили, что такое обычно бывает надо для просмотра или печати, значит и средства можно использовать специальные ФР, например.
Abramov Petr V. (2011-02-09 21:46:00) [11]как получить таблицу-матрицу запросом в MSSQL
я не знаю, но для отображения (а для чего еще, не представляю), можно девэекспересс или фастрепорт использовать, и там, и там все по нонешним временам грамотно в этом плане.
sniknik (2011-02-09 16:34:00) [12]> придется динамически запрос формировать.
хотя... может в старших версиях mssql уже ввели pivot table как в акцессе... тогда может и не придется. (у меня просто 2000й)
sniknik (2011-02-09 16:32:00) [13]для 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 это подзапрос), т.к. по ним группировка, а из-за служб придется динамически запрос формировать.
> А не кросс автору надо?
скорее всего оно и есть
Гость (2011-02-09 16:27:00) [14]Inovet ©
нет.
Игорь Шевченко © (09.02.11 15:12) [2]
правильно, так подумал потом
но у меня не известно заранее, ни размер по X, ни по Y
т.е. Операторы и службы - обе величины динамические
Игорь Шевченко (2011-02-09 16:10:00) [15]
> А не кросс автору надо?
ты изъясняйся понятно, если не трудно
Inovet (2011-02-09 16:08:00) [16]> [1] Игорь Шевченко © (09.02.11 15:04)
> SUM(CASE ... WHEN ...)
А не кросс автору надо?
Игорь Шевченко (2011-02-09 15:12:00) [17]пример для 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
Игорь Шевченко (2011-02-09 15:04:00) [18]SUM(CASE ... WHEN ...)
Это ANSI SQL