#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
перед aUNION
, он должен идти в самом конце. Вам нужно будет использовать подзапросы.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
перед aUNION
, он должен идти в самом конце. Вам нужно будет использовать подзапросы
Например:
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
в верхний подзапрос, вам нужно будет раскомментировать столбец в нижнем, @hmm40895. @Lurna — рассмотрит ваш пример.