Конференция "Базы" » Transact SQL Итоговая сумма в строке [MSSQL]
 
  • Михаил (06.02.13 18:41) [0]
    Дана таблица t с произвольным количеством целочисленных столбцов, т.е. в запросе нельзя обращаться к конкретному столбцу
    Необходимо написать запрос, возвращающий все столбцы таблицы, и столбец, содержащий сумму значений всех столбцов для строки.
    Результат должен быть в таком виде:
        |c1 |c2   |c3   |Total
        -----------------------
        |1 |7   |1   |9
        |1 |6   |2   |9
        |3 |5   |3   |11
        |4 |4   |4   |12
        |1 |7   |1   |9
        |6 |2   |6   |14
        |7 |1   |7   |15

    ======================

    Такой вариант отпадает
    SELECT *, c1+c2+c3 Total FROM t

    Использовать можно только SELECT или WITH
  • O'ShinW © (06.02.13 20:20) [1]
    ?
    SELECT * FROM INFORMATION_SCHEMA.Columns where TABLE_NAME =
  • Михаил (06.02.13 20:23) [2]
    Ну данный запрос извлечет наименования всех столбцов указанной таблицы. А как их вывести? и суммировать?
  • знайка (06.02.13 20:33) [3]
    А для чего такое надо?
    Это к тому что незнать про колонки - еще надо постататься...
  • Михаил (06.02.13 20:34) [4]
    Ну вот такое задание дали
  • Медвежонок Пятачок © (06.02.13 20:43) [5]
    Ну данный запрос извлечет наименования всех столбцов указанной таблицы.

    что позволит на лету написать нужный селект.
  • Михаил (06.02.13 21:27) [6]
    Сделал такой запрос:
    SELECT TABLE_NAME,
    (SELECT COLUMN_NAME + '+'
    FROM INFORMATION_SCHEMA.Columns t2 WHERE t1.TABLE_NAME = t2.TABLE_NAME FOR xml path('')) summa
    FROM INFORMATION_SCHEMA.Columns t1
    WHERE TABLE_NAME='t'
    GROUP BY TABLE_NAME



    Вернул такой результат:
     |TABLE_NAME |summa
       -----------------------
     |t   |c1+c2+c3+

    А как теперь сформировать такой запрос типа
    SELECT *, @summa FROM t


    Чтобы за место @summa подставилось значение поля summa без последнего плюса?
  • O'ShinW © (07.02.13 09:53) [7]
    SET @T = 'AAA'
    SET @S = 'SELECT *, '
    SELECT
     @S = @S + COLUMN_NAME + '+'
    FROM
     INFORMATION_SCHEMA.COLUMNS
    WHERE
     TABLE_NAME = @T
    SET @S = SUBSTRING(@S, 0, Len(@S)) + ' as Total from ' + @T
    SELECT @S
  • turbouser © (07.02.13 10:49) [8]
    тогда уж
    DECLARE @SUMMA NVARCHAR(MAX)
    SELECT @SUMMA = COALESCE(@SUMMA + '+', '') + COLUMN_NAME
    FROM   INFORMATION_SCHEMA.COLUMNS
    WHERE  TABLE_NAME = @T
    SELECT @SUMMA

  • Михаил (07.02.13 13:11) [9]
    Спасибо большое O'ShinW, turbouser

    Решил следующим образом.

    DECLARE @total nvarchar(MAX)
    SELECT @total = COALESCE(@total + '+', '') + COLUMN_NAME
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 't'
    EXEC('SELECT *, ' + @total + ' Total FROM t')



    Хотя в задаче сказано, решить нужно одним запросом и начинаться он должен либо с SELECT, либо с WITH. Динамические запросы тоже нельзя использовать. Но я незнаю, реально ли сделать такое без динамического запроса. Как думаете реально?
  • O'ShinW © (07.02.13 16:15) [10]

    > решить нужно одним запросом и начинаться он должен либо
    > с SELECT

    Да запросто :)

    select * from
    OPENQUERY(,'
  • O'ShinW © (07.02.13 16:16) [11]
    А если серьёзно - не знаю.
    Откуда задание такое, вообще?
  • Михаил (07.02.13 16:36) [12]
    Перед собеседованием дали 6 задач на составление запросов MS SQL. Все задачи нужно решить одним запросом, не динамическим. 5 задач сделал, правда не все конечно одним запросом. Задания прям как на олимпиаду, довольно сложные. И эту задачу получается тоже не одним запросом решил.
    Ну посмотрим что скажут. Вообще непойму смысла в том, зачем все решать одним SELECT'ом. Может там нужно знать тонкости языка, чтобы решить их одним запросом, но что-то я сомневаюсь.
  • O'ShinW © (08.02.13 09:12) [13]
    я то же сомневаюсь

    А формально OpenQuery больше по заданию будет. Зарос один :)

    select * from OPENQUERY( САМ_ЭТОТ_СЕРВЕР,
    ' declare @A int;
    Set @A = 6;
    Select @A as Q
    ')
    T join (select 6 as W, '232323' as У) T2
    on T.Q = T2.W
  • Е556 (08.02.13 13:13) [14]
    Скажете, где можно скачать учебники по БД для начинающих. Желательно, не очень сложные, чтобы можно было самостоятельно разобраться. То, что я нашла: http://sdb.su/bd/824-razrabotka-servernoj-chasti-microsoft-sql-server.html не подходит мне, ничего не понимаю.
  • turbouser © (08.02.13 13:57) [15]

    > Е556   (08.02.13 13:13) [14]

    Мартин Грубер, Том кайт, Кристофер Дейт (К. Дж. Дейт)
  • Кщд (10.02.13 12:29) [16]
    >Михаил   (06.02.13 18:41)
    поиск по xml, xquery.
 
Конференция "Базы" » Transact SQL Итоговая сумма в строке [MSSQL]
Есть новые Нет новых   [134430   +2][b:0][p:0.001]