0
这是我的收费表。它让我了解本月的费用细节。如果我做SELECT * from FeeTest
,它将使用当前月份的费用,因为它使用的是GETDATE()
。默认情况下,IsPaid设置为false。基于列状态的特定案例计算
CREATE TABLE [dbo].[FeeTest](
[ClassId] [int] NOT NULL,
[HeaderId] [int] NOT NULL,
[FeeAmount] [money] NOT NULL,
[FeePeriod] AS ((datename(month,getdate())+', ')+datename(year,getdate())),
[DueDate] AS (CONVERT([date],dateadd(month,(-1),dateadd(month,datediff(month,(0),getdate())+(1),(9))))),
[FeeBillGeneratedOn] AS (CONVERT([date],dateadd(month,(-1),dateadd(month,datediff(month,(0),getdate())+(1),(0))))),
[IsPaid] [bit] NOT NULL DEFAULT ((0)),
CONSTRAINT [UNIQ_feeHeadersTest] UNIQUE CLUSTERED
(
[ClassId] ASC,
[HeaderId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[FeeTest] WITH CHECK ADD FOREIGN KEY([ClassId])
REFERENCES [dbo].[Classes] ([ClassId])
GO
ALTER TABLE [dbo].[FeeTest] WITH CHECK ADD FOREIGN KEY([HeaderId])
REFERENCES [dbo].[FeeHeaders] ([HeaderId])
GO
这是我如何得到费用的细节所有个别学生
select Students.StudentId, Students.StudentName, Students.RegistrationNumber, FeeTest.FeePeriod, SUM(FeeTest.FeeAmount) AS TotalFee, FeeTest.DueDate, FeeTest.IsPaid
from Students inner join FeeTest on Students.ClassId = FeeTest.ClassId group by Students.StudentId, Students.StudentName, Students.RegistrationNumber, FeeTest.DueDate,
FeeTest.IsPaid, FeeTest.FeePeriod
这是我保持所有学生的月度历史新高IsPaid无论是0还是1
CREATE TABLE FeePaymentStatus
(
studentId int not null primary key,
studentName nvarchar(255) not null,
registrationNumber nvarchar(9) not null,
FeePeriod nvarchar(62) not null,
FeeAmount money not null,
dueDate date not null,
IsPaid bit not null,
CONSTRAINT [UNIQ_FeePeriod] UNIQUE CLUSTERED
(
[StudentId],
[FeePeriod]
)
);
INSERT INTO FeePaymentStatus
select Students.StudentId, Students.StudentName, Students.RegistrationNumber, FeeTest.FeePeriod, SUM(FeeTest.FeeAmount) AS TotalFee, FeeTest.DueDate, FeeTest.IsPaid
from Students inner join FeeTest on Students.ClassId = FeeTest.ClassId group by Students.StudentId, Students.StudentName, Students.RegistrationNumber, FeeTest.DueDate,
FeeTest.FeePeriod, FeeTest.IsPaid
接下来我要做的是在12月再次运行时将仍然有IsPaid的学生的费用加到0。
select Students.StudentId, Students.StudentName, Students.RegistrationNumber, FeeTest.FeePeriod, SUM(FeeTest.FeeAmount) AS TotalFee, FeeTest.DueDate, FeeTest.IsPaid
from Students inner join FeeTest on Students.ClassId = FeeTest.ClassId group by Students.StudentId, Students.StudentName, Students.RegistrationNumber, FeeTest.DueDate,
FeeTest.IsPaid, FeeTest.FeePeriod
我该如何做到这一点? HeaderId在第一段代码确实有一个头读取其中有默认值为0。我使用SQL服务器2014年