为什么我会在ON子句和分组上出错?

时间:2017-01-19 07:36:44

标签: sql sql-server tsql

我有这个代码,我通过不断给出2行错误来测试:

  

Msg 156,Level 15,State 1,Procedure   GetUserPaymentsPartialRecordByClass,第25行附近的语法不正确   关键字' on'。消息156,第15级,状态1,程序   GetUserPaymentsPartialRecordByClass,第50行附近的语法不正确   关键字' group'。

CREATE PROCEDURE [Accounts].[GetUserPaymentsPartialRecordByClass] 
   @classID int=1 
AS
BEGIN

create table #temp (sID int,cID int, accID int, className varchar(50),transactions varchar(max),PayableAmount money,TotalAmountPaid money,PendingAmount money)

INSERT into #temp
    (sID,cID,accID,className)
select 
    distinct st.StudentID as sID, 
    st.ClassToWhichAdmitted_ID as cID ,
    st.Account_ID as accID, 
    c.ClassName as className
from School.StudentInformation st
    left join School.Classes c 
        on st.ClassToWhichAdmitted_ID= c.ClassID 
where st.ClassToWhichAdmitted_ID= @classID

update temp
set temp.transactions=transactions
from #temp temp outer apply(
select convert(varchar,Convert(decimal(10,0),t.Credit))+', ' AS 'data()'
from Accounts.Transactions T 
on T.Account_ID=temp.accID
and T.Credit>0 and T.IsReversed=0 
and Particulars Like '%Received%'
inner join Accounts.Invoices inv
on inv.Student_ID=temp.sID and inv.InvoiceNumber=T.InvoiceNumber
FOR XML PATH('')
) s(transactions)




update T
set PayableAmount =  sum(i.Amount+ i.Fine) 
from #temp T 
INNER JOIN Accounts.Invoices I ON I.Student_ID= T.sId and i.Class_ID = T.cID             

update temp
set TotalAmountPaid =sum(t.Credit) from 
#temp temp Inner join
Accounts.Transactions T 
on t.Account_ID = temp.accID
and t.Credit>0 AND t.IsReversed=0 and
t.Particulars Like '%Received%'
inner join Accounts.Invoices inv
on inv.Student_ID=temp.sID and inv.InvoiceNumber=T.InvoiceNumber
group by T.Account_ID


update temp
sett PendingAmount= (PayableAmount - TotalAmountPaid)

SELECT st.StudentName, st.StudentRegisterationNo,ClassName, 
    transactions as Paid, Convert(decimal(10,0),TotalAmountPaid) as TotalPaid,
    PayableAmount, PendingAmount as 'PendingAmount' FROM #temp T inner join School.StudentInformation ST 
    On st.StudentID= T.sId



END

3 个答案:

答案 0 :(得分:2)

猜猜你错过了查询中的联接......

select convert(varchar,Convert(decimal(10,0),t.Credit))+', ' AS 'data()'
from Accounts.Transactions T 
on T.Account_ID=temp.accID

答案 1 :(得分:2)

检查这个。

1.您不能按时间分组使用更新

2.Your Joins miss in the cross apply查询现已更正。

CREATE PROCEDURE [Accounts].[GetUserPaymentsPartialRecordByClass] 
   @classID int = 1 
AS
BEGIN

    CREATE TABLE #temp (sID int,cID int, accID int, className varchar(50),transactions varchar(max),PayableAmount money,TotalAmountPaid money,PendingAmount money)

    INSERT INTO #temp
        (sID,cID,accID,className)
    SELECT 
        DISTINCT st.StudentID AS sID, 
        st.ClassToWhichAdmitted_ID AS cID ,
        st.Account_ID AS accID, 
        c.ClassName AS className
    FROM School.StudentInformation st
        LEFT JOIN School.Classes c 
            ON st.ClassToWhichAdmitted_ID = c.ClassID 
    WHERE st.ClassToWhichAdmitted_ID = @classID

    UPDATE temp
    SET temp.transactions = transactions
    FROM #temp temp outer apply(
    SELECT CONVERT(VARCHAR,CONVERT(DECIMAL(10,0),t.Credit)) + ', ' AS 'data()'
    FROM Accounts.Transactions T 
    INNER JOIN Accounts.Invoices inv
    ON inv.Student_ID = temp.sID AND inv.InvoiceNumber = T.InvoiceNumber
    WHERE
     T.Account_ID = temp.accID
    and T.Credit > 0 AND T.IsReversed=0 
    and Particulars LIKE '%Received%'
    FOR XML PATH('')
    ) s(transactions)

    UPDATE T
    SET PayableAmount = tt.sums  
    FROM #temp T inner join 
    ( 
    SELECT Student_ID,sum(i.Amount + i.Fine)  AS sums
    FROM #temp T 
    INNER JOIN Accounts.Invoices I ON I.Student_ID = T.sId AND i.Class_ID = T.cID    
    GROUP BY Student_ID
    )tt ON tt.Student_ID = T.sID

    UPDATE temp2
    SET TotalAmountPaid = t.Credit
    FROM #temp temp2 inner join 
    (
    SELECT inv.Student_ID, SUM(t.Credit) AS Credit
    FROM #temp temp Inner join Accounts.Transactions T ON t.Account_ID = temp.accID
    and t.Credit > 0 AND t.IsReversed = 0 AND t.Particulars LIKE '%Received%'
    INNER JOIN Accounts.Invoices inv ON inv.Student_ID = temp.sID AND inv.InvoiceNumber = T.InvoiceNumber
     GROUP BY inv.Student_ID
     )t ON inv.Student_ID = temp.sID

    UPDATE temp
    SET PendingAmount = (PayableAmount - TotalAmountPaid)
    FROM #temp temp

        SELECT st.StudentName, st.StudentRegisterationNo,ClassName, 
        transactions AS Paid, CONVERT(DECIMAL(10,0),TotalAmountPaid) AS TotalPaid,
        PayableAmount, PendingAmount AS 'PendingAmount' FROM #temp T inner join School.StudentInformation ST 
        ON st.StudentID= T.sId

END

答案 2 :(得分:1)

2个地方需要修改 第一个是第20行更新,请尝试以下。

        update temp
    set temp.transactions=transactions
    from #temp temp 
    outer apply(
    select convert(varchar,Convert(decimal(10,0),t.Credit))+', ' AS 'data()'
    from Accounts.Transactions T 
    ) s(transactions)
    inner join Accounts.Invoices inv
    on inv.Student_ID=temp.sID 
    and inv.InvoiceNumber=s.InvoiceNumber
    where s.Account_ID=temp.accID
    and T.Credit>0 and T.IsReversed=0 
    and Particulars Like '%Received%'
    FOR XML PATH('')

和第55行错字,应该设置

update temp
sett PendingAmount= (PayableAmount - TotalAmountPaid)