Possible Duplicate:
Unable to run analytical function in Sql ServerЧто такое эквивалент SQL Server этого запроса Oracle?
Я пытаюсь запустить аналитическую функцию на SQL-сервере, но у меня возникают трудности.
Вот мой запрос в синтаксисе Oracle, который хорошо работает:
SELECT
TEAM_ID,
LEVEL_ID,
FF_ID,
MODULE_ID,
TERR_ID,
MERGE_KEY,
count(distinct TERR_ID) over (partition by TEAM_ID,LEVEL_ID,FF_ID,MODULE_ID)
|| ' of ' ||
count(distinct TERR_ID) over (partition by TEAM_ID,LEVEL_ID,FF_ID)
as MISMATCH_TERR_COUNT_IN_FF
FROM SCN7BBFE80210E04E2F88653A.PA83FB9BD57E044618B7AC86A;
Но я получаю сообщение об ошибке при попытке сделать то же самое для SQL Server.
Я создал таблицу с колоннами TEAM_ID
, LEVEL_ID
, FF_ID
, MODULE_ID
, TERR_ID
и MERGE_KEY
, а затем вставленных значений в таблицу, как так:
insert into PA83FB9BD57E044618B7AC86A values('3',1,'YH','PERF','3XBDA3',1)
insert into PA83FB9BD57E044618B7AC86A values('3',1,'YH','PERF','3XAJA3',1)
Вот запрос, я использую для SQL Сервер:
SELECT
TEAM_ID,
LEVEL_ID,
FF_ID,
MODULE_ID,
TERR_ID,
MERGE_KEY,
ISNULL(CAST(count(distinct TERR_ID) OVER(PARTITION BY TEAM_ID, LEVEL_ID, FF_ID, MODULE_ID) AS nvarchar(max)), '')
+ ' of ' +
ISNULL(CAST(count(distinct TERR_ID) OVER(PARTITION BY TEAM_ID, LEVEL_ID, FF_ID) AS nvarchar(max)), '')
AS MISMATCH_TERR_COUNT_IN_FF
FROM dbo.PA83FB9BD57E044618B7AC86A
Когда я пытаюсь запустить этот запрос, я получаю следующее сообщение об ошибке:
ERROR:Incorrect syntax near 'distinct'.
Я попытался создать минимальный запрос, который дает ту же ошибку, и я пришел с этим:
SELECT
TEAM_ID,
LEVEL_ID,
FF_ID,
MODULE_ID,
TERR_ID,
MERGE_KEY,
cast(count(distinct TERR_ID) OVER(PARTITION BY TEAM_ID, LEVEL_ID, FF_ID, MODULE_ID)
AS MISMATCH_TERR_COUNT_IN_FF
FROM dbo.PA83FB9BD57E044618B7AC86A
И я все еще получаю ошибку:
ERROR:Incorrect syntax near 'distinct'
Я также попытался удалить cast()
часть также, но такая же ошибка всегда появляется.
Что я делаю неправильно?
Я думаю, что здесь может быть проблема 'PARTITION BY'. Насколько мне известно, SQL Server не имеет прямого эквивалента этой функции. В общем, Oracle PL/SQL и Microsoft T-SQL имеют много несовместимых функций, поэтому не всегда можно получить одинаковое поведение от обоих. –
@ DanielPryden - Это неверно. У SQL Server, безусловно, есть 'partition by' и' over'. Поскольку я ответил на этот вопрос здесь: http://stackoverflow.com/questions/8791559/unable-to-run-analytical-function-in-sql-server/8791603#8791603, SQL Server не может выполнять 'count (col col)' когда 'count' является частью предложения' over'. – Eric
@ Эрик: Спасибо, я этого не знал. –