2017-01-19 7 views
1

私は常に2行にエラーを与えることによってテストされています。このコードがあります。ON句とグループでエラーが発生するのはなぜですか?

メッセージ156、レベル15、状態1、プロシージャ GetUserPaymentsPartialRecordByClass、「オン」 キーワードの近くに25行目に正しくない構文を。メッセージ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

私は – Jens

+0

を知っているのでupdateステートメントはgroup by節を持つことができません。setではなく 'set'です。そして、SQL Serverはステートメントの間にセパレータを必要としませんか? – jarlh

+0

@jarlh SQL Server *ではセパレータを使用することを推奨していますが、特定の場合を除いて、*セパレータは必要ありません。 – RBarryYoung

答えて

2

あなたのクエリに参加欠けている...

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

はい..これはエラーの理由かもしれません –

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) 
2

チェックこれを設定する必要があります。

1.Youは

2.Yourがクロスに配置ミスが今修正されたクエリを適用ジョイン句によって時間グループの更新を使用することはできません。

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 
+0

おかげで素晴らしいですが、まだ問題があります。 Updat T set PayableAmountがエラーをスローします。 「集計は、UPDATEのセットリストには表示されません」 – Covert

+0

また、同じでないはずの行をすべて更新します。金額の合計は学生ごとに異なる必要があります。 – Covert

+0

まだエラーがあります。更新temp2部分はGROUPエラーをスローし、TRANSACTIONSもあいまいです。 – Covert

関連する問題