Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
2-1374074284
Valdis
2013-07-17 19:18
2014.04.27
access violation при работе с потоками


2-1374264972
Vasa777
2013-07-20 00:16
2014.04.27
pbyte


1-1324983124
Виктор М.
2011-12-27 14:52
2014.04.27
Отправить POST-запрос в Windows-1251 в Indy


1-1323427660
rhiannon
2011-12-09 14:47
2014.04.27
ECXML Compability с Delphi XE


2-1374233505
kuku
2013-07-19 15:31
2014.04.27
Ненужный звук при нажатии Enter в поле TEdit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский