我有这个代码,我通过不断给出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
答案 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)