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