Исправление неправильного синтаксиса рядом с ключевыми словами «UNION» и «Top»

Я очень ценю вашу помощь в этом вопросе, мне очень хотелось бы, чтобы кто-нибудь сказал мне, почему ошибки Select Distinct и UNION ALL, и кажется, что «TOP» (1) также имеет некоторую проблему объединения с предложением, с которым я не знаком даже после Я провел тщательное исследование синтаксиса. Можно ли связать второй сервер с моим запросом, я просто пытаюсь посмотреть, нужен ли второму серверу другой формат после Select top (1).

Ищем этот вывод:

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

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

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

Сообщение 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

person hmm4089    schedule 25.11.2020    source источник
comment
Вы не можете поставить ORDER BY перед UNION, он должен стоять в самом конце. Вам нужно будет использовать подзапросы.   -  person Larnu    schedule 25.11.2020
comment
@Larnu - у тебя есть пример?   -  person hmm4089    schedule 25.11.2020
comment
@Larnu - после настройки ORDER BY я остаюсь с другой ошибкой. Я уверен, что вы не можете увидеть мои результаты, однако это другая ошибка: сообщение 156, уровень 15, состояние 1, строка 14. Неверный синтаксис рядом с ключевым словом «Выбрать». Сообщение 1062, уровень 15, состояние 1, строка 32 Предложение TOP N WITH TIES не допускается без соответствующего предложения ORDER BY.   -  person hmm4089    schedule 25.11.2020


Ответы (1)


Как я сказал:

Вы не можете поставить ORDER BY перед 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;
person Larnu    schedule 25.11.2020
comment
Можно ли применить DISTINCT 'Server2' AS 'Server' и TOP 1 к одному столбцу? - person hmm4089; 25.11.2020
comment
Вы не применяете DISTINCT к столбцу, вы применяете его к набору данных, @hmm4089. С TOP (1) WITH TIES было мало смысла там находиться, так как вы уже должны получать четкие результаты; если бы вы не были, предложение OVER для вашего RANK было неправильным. - person Larnu; 25.11.2020
comment
Я добавил «Server1» AS «Server» в верхний запрос, и я получаю только 1 строку, отображающую «Server», мои образцы данных не перечислены. - person hmm4089; 25.11.2020
comment
Если вы добавите столбец server в верхний подзапрос, вам нужно будет раскомментировать столбец в нижнем, @hmm4089 - person Larnu; 25.11.2020
comment
@Lurna - рассмотрит ваш пример. - person hmm4089; 25.11.2020
comment
Ларну* @hmm4089 . - person Larnu; 25.11.2020
comment
@Lurna - запрос совпадает с серверами, однако он не извлекает все строки для in.Name, in.Vendor для COUNT (*) Count_InvoiceNo. - person hmm4089; 25.11.2020
comment
- Запрос совпадает с серверами, однако он не извлекает все строки для in.Name, in.Vendor для COUNT(*) Count_InvoiceNo. - person hmm4089; 25.11.2020
comment
Вероятно, из-за того, что TOP отфильтровывает их, mhm4098.... На этом этапе вам необходимо предоставить образцы данных и ожидаемые результаты. - person Larnu; 25.11.2020
comment
где я могу предоставить образцы данных? Я не могу редактировать со своей стороны. - person hmm4089; 25.11.2020
comment
Вы всегда можете редактировать свой собственный пост, если он не заблокирован. - person Larnu; 25.11.2020
comment
@Lurna - я отредактировал и обновил запрос и включил изображение с необходимыми строками списка данных. - person hmm4089; 25.11.2020