2016-01-12 5 views
0

Когда я пытаюсь запустить НИЖЕ запрос,КТР с помощью SQL Server

seq = row_number() over 
(
    partition by t.CustID 
    order by t.InvoiceID, 
      t.Date, 
      CASE WHEN t.S_Type = 'Receipt Voucher' THEN 1 ELSE 2 END 
) 

; 

WITH cte 
AS (
    SELECT CustID, 
     [InvoiceID], 
     S_Type, 
     DATE, 
     Debit, 
     Credit, 
     seq = row_number() OVER (
      PARTITION BY CustID, 
      ORDER BY InvoiceID, 
       DATE, 
       CASE 
        WHEN S_Type = 'Receipt Voucher' 
         THEN 1 
        ELSE 2 
        END 
      ) 
    FROM Statement 
    ) 
SELECT c.[InvoiceID], 
    c.S_Type AS Type, 
    c.DATE, 
    .Debit, 
    c.Credit, 
    b.Balance 
FROM cte c 
CROSS APPLY (
    SELECT Balance = SUM(Debit) - SUM(Credit) 
    FROM cte AS x 
    WHERE x.CustID = c.CustID 
     AND x.seq <= c.seq 
    ) b 
WHERE c.CustID = '48' 
    AND DATE BETWEEN '2015-01-01' 
     AND '2016-01-01' 
ORDER BY seq 

Я получаю следующее сообщение об ошибке:

Msg 102, Level 15, State 1, Line 1 Incorrect syntax near '='. Msg 156, Level 15, State 1, Line 21 Incorrect syntax near the keyword 'ORDER'.

+0

Удалить запятую после 'PARTITION BY CustId' – Siyual

ответ

3

Проблема здесь, в вашем Cte:

... 
seq = row_number() OVER (
     PARTITION BY CustID, 
     ORDER BY InvoiceID, 
      DATE, 
      CASE 
       WHEN S_Type = 'Receipt Voucher' 
        THEN 1 
       ELSE 2 
       END 
     ) 
... 

У вас есть , после PARTITION BY CustID, правильный синтаксис без этой запятой:

... 
seq = row_number() OVER (
     PARTITION BY CustID 
     ORDER BY InvoiceID, 
      DATE, 
      CASE 
       WHEN S_Type = 'Receipt Voucher' 
        THEN 1 
       ELSE 2 
       END 
     ) 
... 

Другой вопрос, у вас есть в вашем запросе, что у вас нет псевдонима для Debit поля в конечном SELECT:

SELECT c.[InvoiceID], 
    c.S_Type AS Type, 
    c.DATE, 
    .Debit, <-- Here 
    c.Credit, 
    b.Balance 

Полный запрос будет выглядеть следующим образом:

;With Cte As 
(
    Select CustId, InvoiceId, S_Type, Date, Debit, Credit, 
      Seq = Row_Number() Over ( Partition By CustId 
             Order By  InvoiceId, 
                 Date, 
                 Case 
                  When S_Type = 'Receipt Voucher' 
                   Then 1 
                  Else 2 
                 End 
            ) 
    From Statement 
) 
Select  C.InvoiceID, 
      C.S_Type As Type, 
      C.Date, 
      C.Debit, 
      C.Credit, 
      B.Balance 
From  Cte  C 
Cross Apply 
(
    Select Balance = Sum(X.Debit) - Sum(X.Credit) 
    From Cte  X 
    Where X.CustId = C.CustId 
    And  X.seq <= C.seq 
) B 
Where C.CustID = '48' 
And  C.Date Between '2015-01-01' And '2016-01-01' 
Order By C.seq 
+0

все еще есть ошибки неправильный синтаксис рядом с PARTITION expecting '(' или выберите – Ayman

+0

Я не вижу ничего другого, я ошибаюсь в запросе, который вы указали ... Выполняется ли ваш внутренний запрос CTE? – Siyual

+0

Я предполагаю, что вы не используете случайный скрипт над вашим фактическим запросом (перед 'WITH Cte'). Если вы используете это, это может быть частью вашей ошибки. – Siyual

Смежные вопросы