Конференция "Базы" » Подскажите как получить таблицу-матрицу запросом в MSSQL
 
  • Гость (09.02.11 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
    ....


    циклами по датасету сделал, а теперь хочу одним запросом.
    как?
  • Игорь Шевченко © (09.02.11 15:04) [1]
    SUM(CASE ... WHEN ...)

    Это ANSI SQL
  • Игорь Шевченко © (09.02.11 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 © (09.02.11 16:08) [3]
    > [1] Игорь Шевченко ©   (09.02.11 15:04)
    > SUM(CASE ... WHEN ...)

    А не кросс автору надо?
  • Игорь Шевченко © (09.02.11 16:10) [4]

    > А не кросс автору надо?


    ты изъясняйся понятно, если не трудно
  • Гость (09.02.11 16:27) [5]
    Inovet ©
    нет.

    Игорь Шевченко ©   (09.02.11 15:12) [2]
    правильно, так подумал потом
    но у меня не известно заранее, ни размер по X, ни по Y
    т.е. Операторы и службы - обе величины динамические
  • sniknik © (09.02.11 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 © (09.02.11 16:34) [7]
    > придется динамически запрос формировать.
    хотя... может в старших версиях mssql уже ввели pivot table как в акцессе... тогда может и не придется. (у меня просто 2000й)
  • Abramov Petr V. (09.02.11 21:46) [8]
    как получить таблицу-матрицу запросом в MSSQL
    я не знаю, но для отображения (а для чего еще, не представляю), можно девэекспересс или фастрепорт использовать, и там, и там все по нонешним временам грамотно в этом плане.
  • Inovet © (10.02.11 05:17) [9]
    > [4] Игорь Шевченко ©   (09.02.11 16:10)
    > > А не кросс автору надо?
    >
    > ты изъясняйся понятно, если не трудно

    Вот об этом

    > [5] Гость   (09.02.11 16:27)
    > но у меня не известно заранее, ни размер по X, ни по Y

    Кросс-таблица. Ну и правильно уже заметили, что такое обычно бывает надо для просмотра или печати, значит и средства можно использовать специальные ФР, например.
  • stas © (10.02.11 17:37) [10]
    sniknik ©   (09.02.11 16:34) [7]
    Не как в акцессе еще не придумали. есть pivot но надо явно указывать колонки.
  • stas © (10.02.11 17:39) [11]
    Inovet ©   (10.02.11 05:17) [9]
    пишите хранимку которая будет строить динамический запрос и выполнять его. Т.е. то что написал  sniknik ©   (09.02.11 16:32) [6]
    только должна запихнуть ваша хранимка в текстовую переменную, которую потом запустить на выполнение.
  • sniknik © (10.02.11 17:49) [12]
    > Не как в акцессе еще не придумали.
    вообще то есть начиная с 2005 если верить msdn.
  • sniknik © (10.02.11 17:51) [13]
  • stas © (11.02.11 14:13) [14]
    sniknik ©   (10.02.11 17:51) [13]
    Да сделали, но как я понял там фиксированное количество столбцов.
    т.е. в акцессе, на этапе построения запроса я не указываю количество столбцов, а тут приходится указывать и давать им названия.
  • sniknik © (11.02.11 14:21) [15]
    > а тут приходится указывать и давать им названия.
    не приходится. можно. в акцессе  аналогично, можно давать, можно нет.
  • stas © (11.02.11 14:31) [16]
    sniknik ©   (11.02.11 14:21) [15]
    У меня чего-то не получилось не указывать. Мог конечно не разобраться.
  • Гость (15.02.11 09:18) [17]
    сделал примерно как Игорь Шевченко ©   (09.02.11 15:12) [2] советовал

    только сначала select distinct SNAME пришлось спросить, потом курсор открыть для формирования запроса, а потом его запускать.

    А начальник смешнее сделал - он в excel мою портянку загнал, и как-то там в 3 клика получил что надо :)

    Учите люди Excel...
  • stas © (16.02.11 17:28) [18]
    Гость   (15.02.11 09:18) [17]
    >он в excel мою портянку загнал
    Называется сводная таблица.
 
Конференция "Базы" » Подскажите как получить таблицу-матрицу запросом в MSSQL
Есть новые Нет новых   [134431   +15][b:0][p:0.001]