具有连接到三个表的SQL子查询

问题描述 投票:-1回答:2

我需要查询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
sql subquery
2个回答
0
投票
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
我想要这样

0
投票
[如果我的解释正确,ClassStudent和Student表似乎都是无关紧要的,因为您似乎是在计算付款而不是学生。您也许可以这样做:

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函数而不是左联接子查询来完成的。
© www.soinside.com 2019 - 2024. All rights reserved.