Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подскажите как получить таблицу-матрицу запросом в 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


Наверх

Титульная страница Поиск, карта сайта Написать письмо