【问题标题】:How to show output for group of people instead of single individual?如何显示一组人而不是单个人的输出?
【发布时间】:2017-01-18 18:47:25
【问题描述】:

我编写了这段代码来显示单个学生的 FEE PAID、PENDING 等,但实际上它应该是针对整个班级的学生。我尝试了很多,但不能为整个班级做。这该怎么做 ?忽略@studentID,我只想要@ClassID。

ALTER PROCEDURE [Accounts].[GetUserPaymentsPartialRecord] 
    @StudentId INT= 14,
    @classID int=1 
AS
BEGIN



    declare @accID int
    set @accID= (select st.Account_ID from School.StudentInformation ST where st.StudentID = @StudentId and st.ClassToWhichAdmitted_ID= @classID)

    declare @className varchar(50)
    Set @className= (Select c.ClassName from School.Classes c 
                     Inner Join School.StudentInformation si 
                     ON si.ClassToWhichAdmitted_ID= c.ClassID where si.StudentID= @StudentId) 

    declare @transactions varchar(max)
    Set @transactions=(select convert(varchar,Convert(decimal(10,0),t.Credit))+', ' AS 'data()'  from Accounts.Transactions T 
    where t.Account_ID = (@accID)
    and
    t.Credit>0 
    AND 
    t.IsReversed=0
    AND 
    t.InvoiceNumber in(Select inv.InvoiceNumber from Accounts.Invoices inv where inv.Student_ID= @StudentId) 
    AND 
    Particulars Like '%Received%'
    FOR XML PATH(''))

    declare @PayableAmount money
    set @PayableAmount = (select sum(i.Amount+ i.Fine) from Accounts.Invoices I where I.Student_ID= @StudentId and i.Class_ID = @classID )              


    declare @TotalAmountPaid money
    Set @TotalAmountPaid= (Select sum(t.Credit) from Accounts.Transactions T 
    where t.Account_ID = (@accID)
    and
    t.Credit>0 
    AND 
    t.IsReversed=0 
    AND 
    t.InvoiceNumber in(Select inv.InvoiceNumber from Accounts.Invoices inv where inv.Student_ID= @StudentId) 
    AND 
    t.Particulars Like '%Received%'
    group by t.Account_ID)


    declare @PendingAmount money
    Set @PendingAmount= (@PayableAmount - @TotalAmountPaid)

    SELECT st.StudentName, st.StudentRegisterationNo,@className as ClassName, 
            @transactions as Paid, Convert(decimal(10,0),@TotalAmountPaid) as TotalPaid,
            @PayableAmount, @PendingAmount as 'PendingAmount' FROM School.StudentInformation ST 
    where st.StudentID= @StudentId



END

【问题讨论】:

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

您可以尝试将上述在学生和班级级别的过程简单地作为可以在班级级别查询的表格集

请参阅下面的示例过程:

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

【讨论】:

  • Msg 156,级别 15,状态 1,过程 GetUserPaymentsPartialRecordByClass,第 25 行关键字“on”附近的语法不正确。消息 156,级别 15,状态 1,过程 GetUserPaymentsPartialRecordByClass,第 50 行关键字“组”附近的语法不正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 2013-10-06
  • 2018-08-16
  • 2020-07-19
  • 2017-09-06
  • 1970-01-01
  • 2019-06-20
相关资源
最近更新 更多