Настройка неправильного синтаксиса рядом с ключевыми словами ‘UNION’ и ‘Top’

#sql-server #ssms-2017 #ssms-2016

#sql-сервер #ssms-2017 #ssms-2016

Вопрос:

Я очень ценю вашу помощь в этом вопросе, мне бы очень хотелось, чтобы кто-нибудь сказал мне, почему выберите Distinct и ОБЪЕДИНИТЕ ВСЕ ошибки, и похоже, что ‘TOP’ (1) также имеет некоторые проблемы с объединением с предложением, с которым я не знаком, даже после того, как я провел свое исследование синтаксиса due diligence. Можно ли связать второй сервер с моим запросом, я просто пытаюсь выяснить, нужен ли второму серверу другой формат после «Select top (1)».

Ищу этот результат:

Мои сообщения об ошибках:

Сообщение 156, уровень 15, состояние 1, строка 23
Неправильный синтаксис рядом с ключевым словом ‘UNION’.

Сообщение 156, уровень 15, состояние 1, строка 30
Неправильный синтаксис рядом с ключевым словом ‘top’.

Сообщение 319, уровень 15, состояние 1, строка 30
Неправильный синтаксис рядом с ключевым словом ‘with’. Если этот оператор является обычным табличным выражением, предложением xmlnamespaces или предложением контекста отслеживания изменений, предыдущий оператор должен заканчиваться точкой с запятой.

SQL — запрос:

 SELECT DISTINCT
'SERVER1' AS 'Server'
FROM (
Select top (1) with ties in.Name, in.Vendor, count(*) Count_InvoiceNo

FROM Data.dbo.Invoices AS in

where in.InvDate >= DATEADD(MONTH,-12, GETDATE())

group by in.Name, in.Vendor

order by rank() over(partition by in.Name order by count(*) DESC)) sq


UNION ALL



SELECT DISTINCT
'SERVER2' AS 'Server'
FROM (
Select top (1) with ties in.Name, in.Vendor, count(*) Count_InvoiceNo

FROM Data.dbo.Invoices AS in

where in.InvDate >= DATEADD(MONTH,-12, GETDATE())

group by in.Name, in.Vendor

order by rank() over(partition by in.Name order by count(*) DESC)) sq
 

Комментарии:

1. Вы не можете поместить an ORDER BY перед a UNION , он должен идти в самом конце. Вам нужно будет использовать подзапросы.

2. @Larnu — у вас есть пример?

3. @Larnu — после корректировки ORDER BY я остаюсь с другой ошибкой. Я уверен, что вы не можете увидеть мои результаты, однако, это другая ошибка: сообщение 156, уровень 15, состояние 1, строка 14 Неправильный синтаксис рядом с ключевым словом ‘Select’. Msg 1062, уровень 15, состояние 1, строка 32 Предложение TOP N WITH TIES не допускается без соответствующего предложения ORDER BY.

Ответ №1:

Как я уже сказал:

Вы не можете поместить an ORDER BY перед a UNION , он должен идти в самом конце. Вам нужно будет использовать подзапросы

Например:

 SELECT *
FROM (
    SELECT TOP (1) WITH TIES
        in.Name, in.Vendor, COUNT(*) Count_InvoiceNo
    FROM 
        Data.dbo.Invoices AS in
    WHERE 
        in.InvDate >= DATEADD(MONTH, -12, GETDATE())
    GROUP BY
        in.Name, in.Vendor
    ORDER BY
        RANK() OVER (PARTITION BY in.Name ORDER BY COUNT(*) DESC))sq
UNION ALL
SELECT *
FROM (
    SELECT TOP (1) WITH TIES 
        --'Server2' AS 'Server' --This column isn't in your top query
         in.Name, in.Vendor, COUNT(*) Count_InvoiceNo
    FROM 
        Analytics.dbo.Invoices AS in
    WHERE 
        in.InvDate >= DATEADD(MONTH, -12, GETDATE())
    GROUP BY
        in.Name, in.Vendor
    ORDER BY
        RANK() OVER (PARTITION BY in.Name ORDER BY COUNT(*) DESC)) sq;
 

Комментарии:

1. Можно ли применить ОТДЕЛЬНЫЕ ‘Server2’ КАК ‘Server’ и TOP 1 в одном столбце?

2. Вы применяете его не DISTINCT к столбцу, а к набору данных, @hmm4089 . С TOP (1) WITH TIES учетом того, что это имело мало смысла, находясь там, поскольку вы уже должны были получать четкие результаты; если вы не OVER были, то пункт для вашего RANK был неправильным.

3. Я добавил «Server1» В КАЧЕСТВЕ «Сервера» в верхнем запросе, и я получаю только 1 строку, отображающую «Сервер», в моем примере данных нет.

4. Если вы добавляете столбец server в верхний подзапрос, вам нужно будет раскомментировать столбец в нижнем, @hmm4089

5. @Lurna — рассмотрит ваш пример.