GROUP BY T1. *? Группировать по всем столбцам в Таблице 1, объединять их слева по таблице 2 и Агрегировать функции в столбцах T2? - PullRequest
0 голосов
/ 09 января 2020

У меня есть запрос, который объединяет 2 таблицы. Таблица 1 имеет много столбцов и может в конечном итоге расширяться. Таблица 2 также имеет несколько столбцов, но я буду выполнять статистические функции на 90% ее столбцов. Таблица 1 содержит более 300 строк, Таблица 2 содержит более 84 000 строк.

SELECT 
     t1.*
    ,t2.c2
    ,SUM(t2.c3)
    ,SUM(t2.c4)
FROM 
    Table1 AS t1 
    LEFT JOIN Table2 AS t2 ON t1.c10 = t2.c1
GROUP BY 
     t1.* 
    ,t2.c2

Я получаю сообщение об ошибке Incorrect Syntax near '*', и она указывает на строку, содержащую оператор GROUP BY.

Мне известно, что SELECT t1.* работает, когда я запускал эту часть до попытки агрегирования столбцов T2, и она работала, как ожидалось.

Есть ли способ быстро GROUP BY всех столбцы в Т1? Я знаю, что обычно мы выбираем только необходимые столбцы, но в этом случае мне нужны все столбцы T1.

Предыдущее исследование привело меня к тому, чтобы найти только случаи, когда использовалась 1 таблица, и в основном люди искали, чтобы получить или удалите повторяющиеся значения. Я собираюсь специально объединить 300 записей T1 с 84K записями T2 без необходимости именовать все столбцы из T1 в разделе GROUP BY.

Ответы [ 3 ]

0 голосов
/ 09 января 2020

Этот метод немного нетрадиционен, но вы можете передать его в переменную с помощью Dynami c sql. Ниже приведен пример того, как вы можете это сделать:

declare @test nvarchar(max)
set @test = ''
select @test += Column_name +',' from information_schema.columns where table_name='Table1'
DECLARE @sql nvarchar(max)
SELECT @sql = N'SELECT top 10 ' +@test+ 'NULL as a FROM Table1;'
EXEC sp_executesql @sql

Вы можете применить тот же принцип и переписать свой запрос, чтобы использовать группу по функции. Надеюсь, это поможет.

0 голосов
/ 09 января 2020

Основываясь на статье, опубликованной @wosi, https://dba.stackexchange.com/questions/21226/why-do-wildcards-in-group-by-statements-not-work, я смог изменить код и получить ожидаемые результаты. Обратите внимание, что я перешел с 80К до 70К, потому что я соединял таблицы в 1 столбце. То, как мои данные были структурированы, мне пришлось объединить в 2 столбца. Конечный код выглядит примерно так:

SELECT
     t1.*
    ,t2.c2
    ,t2.c3
    ,t2.c4
FROM
    Table1 AS t1
    LEFT JOIN
        (SELECT c2, SUM(c3), SUM(c4)
         FROM Table2
         GROUP BY c2) AS t2
        ON t1.c10 = t2.c1 AND t1.c15 = t2.c2

0 голосов
/ 09 января 2020

Вы не можете использовать * в GroupBy выражении. Конечно, есть некоторые Dynamic SQL, чтобы запретить ввод всех столбцов в SP, но если вы используете T-SQL in a view, вы должны набрать все columns.

...