我需要查询3张桌子。以下是示例:
学生表格:
StudentId Name
--------------------
1 Aaa
2 Bbb
3 Ccc
ClassStudent表格
ClassId StudentId
-----------------------
1 1
1 2
2 3
付款表格:
PaymentTime ClassId
---------------------
08.10.2019 1
08.10.2019 2
08.09.2019 1
08.09.2019 2
08.08.2019 1
08.07.2019 1
08.06.2019 1
我需要这样:从Payment
表中,我想要PaymentTime
大于08.09.2019的人数。
我该如何做
SELECT ClassStudent.ClassId, COUNT(ClassStudnet.ClassId) AS StudentCount
FROM ClassStudent CS
INNER JOIN PaymentTable PT ON PT.ClassId = CS.ClassId
AND WHERE PT.PaymentTime > CONVERT(date,'08.09.2019')
GROUP BY CS.ClassId
如何在Class
表中查找对Payment
的查询数量?
我希望分别在“ 08.09.2019”之前和之后付款的人数。
赞:
ClassId TotalStudent PaymentBefore08.09.2019 PaymentAfter08.09.2019
--------------------------------------------------------------------
1 10 3 7
2 15 4 11
SELECT
COUNT(CASE WHEN PT.PaymentTime > CONVERT(date, '08.09.2019') THEN COUNT(PT.PaymentTime) END) AS 'AfterTotalCount08.09.2019',
COUNT(CASE WHEN PT.PaymentTime < CONVERT(date, '08.09.2019') THEN COUNT(PT.PaymentTime) END) AS 'BeforeTotalCount08.09.2019'
FROM PaymentTable PT
我想要这样
unested
SELECT PT.ClassId, COUNT(*) AS PaymentCount
FROM PaymentTable PT
WHERE PT.PaymentTime > CONVERT(date, '08.09.2019')
GROUP BY PT.ClassId
但是这不算学生。它计算付款次数(因此为PaymentCount而不是StudentCount)。如果一位学生可以为1堂课支付2笔款项,那么在上面的查询中这将算作2笔。要实际计算学生人数,您需要在付款与学生之间建立直接关系,该关系在您提供的表格中不存在。根据您的评论修改的答案:
SELECT T1.ClassID, T1.TotalStudents, isnull(T2.PaymentCountAfter, 0) PaymentCountAfter, isnull(T2.PaymentCountBeforeEqual, 0) PaymentCountBeforeEqual FROM ( SELECT CS.ClassId, COUNT(*) TotalStudents FROM ClassStudent CS GROUP BY CS.ClassId ) T1 LEFT OUTER JOIN ( SELECT PT.ClassId, COUNT(CASE WHEN PT.PaymentTime > CONVERT(date, '08.09.2019') THEN 1) AS PaymentCountAfter, COUNT(CASE WHEN PT.PaymentTime <= CONVERT(date, '08.09.2019') THEN 1) AS PaymentCountBeforeEqual FROM PaymentTable PT GROUP BY PT.ClassId ) T2 on T2.ClassId = T1.ClassId
这可能是通过Windows函数而不是左联接子查询来完成的。