2016-11-27 52 views
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年

回答

0

使用这样的

SELECT ProductNumber, Name, "Price Range" = 
    CASE 
    WHEN ListPrice = 0 THEN 'Mfg item - not for resale' 
    WHEN ListPrice < 50 THEN 'Under $50' 
    WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250' 
    WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000' 
    ELSE 'Over $1000' 
    END 
FROM Production.Product 
以前的费用