Sql server Sql中的复杂分组,对于单个表和联接具有两个或三个组条件

Sql server Sql中的复杂分组,对于单个表和联接具有两个或三个组条件,sql-server,Sql Server,这是我在ms sql 2008中的表格 Id ReceiptNo StudId Year SchoolId ClassId FeeId Paid Balance 18 1 22 1 4 1 8 50 100 19 1 22 1 4 1 9 100 2300 20 2

这是我在ms sql 2008中的表格

Id  ReceiptNo   StudId  Year    SchoolId    ClassId FeeId   Paid    Balance
18  1             22    1        4           1       8       50      100
19  1             22    1        4           1       9      100     2300
20  2             23    1        5           1       9      200     2200
21  2             23    1        5           1      10      100      900
22  3             22    1        4           1       8      100        0
23  3             22    1        4           1       9      100     2200
我想要Balance最小但不是0的行,该特定StudIdFeeId。实际上,我想向用户显示待支付的费用,这意味着,这个学生在本学年的费用类型中还有这么多余额。如果您观察Id为18的行有StudId 22FeeId 8Balance 100,现在Id为22的行显示Balance 0和相同的学生和相同的费用,这意味着这22名学生已经支付了8 FeeId的所有费用,所以我不想让这个学生感觉到8。现在,同一个学生已经用FeeId 9支付了费用,用Id 19和23排了队,并且有两个余额2300和2200,所以我想证明StudId 22FeeId 9中还有2200个余额,意思是我想显示Id为23的行和Id为19的行。现在这适用于所有学生,不管他们有多少费用

我已经试过了,但是没有成功

SELECT StudentId,FeeTypeId,MIN(FeesBalance) 
FROM FeesCollectionRS 
WHERE FeesBalance !=0 GROUP BY StudentId,FeeTypeId
实际上,我的问题是这样的

SELECT  f.StudentId,f.AcademicYear,f.SchoolId,f.MstClassId,f.FeeTypeId,d.PrnNo ,dbo.GetStudNameByStudid(f.StudentId) student, 
        CAST(year(a.StartOfYear)as CHAR(4))+'-'+ CAST(year(a.EndOfYear)as CHAR(4)) [Academic Year],c.Name,m.FeeType,f.FeesBalance 
FROM 
        FeesCollectionRS f JOIN AcademicYearMasterRS a 
        ON f.AcademicYear = a.Id JOIN ClassMasterRS c 
        ON f.MstClassId = c.MstClassId JOIN MstFeeType m 
        ON f.FeeTypeId = m.FeeTypeId JOIN MstStudentRS d 
        ON d.StudentId = f.StudentId 
WHERE   
        f.AcademicYear =1 and f.FeesBalance !=0

使用
HAVING
子句过滤掉零的最小值:

SELECT StudentId, FeeTypeId, MIN(FeesBalance) MinFeesBalance
FROM FeesCollectionRS 
GROUP BY StudentId, FeeTypeId
HAVING MIN(FeesBalance) > 0
首先对组进行分组以找到最小值,然后仅返回那些具有
HAVING
中的条件的组,这类似于
中的
,其中
等效于组,并应用于聚合结果而不是列值。

如何:

MS SQL Server 2008架构设置

CREATE TABLE StudentFees
(
  Id INT PRIMARY KEY,
  ReceiptNo INT,
  StudId INT,
  [Year] SMALLINT,
  SchoolId INT,
  ClassId INT,
  FeeId INT,
  Paid INT,
  Balance INT
)
INSERT INTO StudentFees
VALUES (18, 1, 22, 1, 4, 1, 8, 50, 100),
       (19, 1, 22, 1, 4, 1, 9, 100, 2300),
       (20, 2, 23, 1, 5, 1, 9, 200, 2200),
       (21, 2, 23, 1, 5, 1, 10, 100, 900),
       (22, 3, 22, 1, 4, 1, 8, 100, 0),
       (23, 3, 22, 1, 4, 1, 9, 100, 2200)
;WITH CTE
AS
(
  SELECT StudId, FeeId, [Year], MAX(Id) As MaxId
  FROM StudentFees
  GROUP BY StudId, FeeId, [Year]
)
SELECT SF.StudId, SF.[Year],
       SF.SchoolId, SF.ClassId, SF.FeeId, SF.Balance
FROM StudentFees SF
INNER JOIN CTE
   ON CTE.MaxId = SF.Id
WHERE SF.Balance > 0
| StudId | Year | SchoolId | ClassId | FeeId | Balance |
|--------|------|----------|---------|-------|---------|
|     22 |    1 |        4 |       1 |     9 |    2200 |
|     23 |    1 |        5 |       1 |     9 |    2200 |
|     23 |    1 |        5 |       1 |    10 |     900 |
查询1

CREATE TABLE StudentFees
(
  Id INT PRIMARY KEY,
  ReceiptNo INT,
  StudId INT,
  [Year] SMALLINT,
  SchoolId INT,
  ClassId INT,
  FeeId INT,
  Paid INT,
  Balance INT
)
INSERT INTO StudentFees
VALUES (18, 1, 22, 1, 4, 1, 8, 50, 100),
       (19, 1, 22, 1, 4, 1, 9, 100, 2300),
       (20, 2, 23, 1, 5, 1, 9, 200, 2200),
       (21, 2, 23, 1, 5, 1, 10, 100, 900),
       (22, 3, 22, 1, 4, 1, 8, 100, 0),
       (23, 3, 22, 1, 4, 1, 9, 100, 2200)
;WITH CTE
AS
(
  SELECT StudId, FeeId, [Year], MAX(Id) As MaxId
  FROM StudentFees
  GROUP BY StudId, FeeId, [Year]
)
SELECT SF.StudId, SF.[Year],
       SF.SchoolId, SF.ClassId, SF.FeeId, SF.Balance
FROM StudentFees SF
INNER JOIN CTE
   ON CTE.MaxId = SF.Id
WHERE SF.Balance > 0
| StudId | Year | SchoolId | ClassId | FeeId | Balance |
|--------|------|----------|---------|-------|---------|
|     22 |    1 |        4 |       1 |     9 |    2200 |
|     23 |    1 |        5 |       1 |     9 |    2200 |
|     23 |    1 |        5 |       1 |    10 |     900 |

CREATE TABLE StudentFees
(
  Id INT PRIMARY KEY,
  ReceiptNo INT,
  StudId INT,
  [Year] SMALLINT,
  SchoolId INT,
  ClassId INT,
  FeeId INT,
  Paid INT,
  Balance INT
)
INSERT INTO StudentFees
VALUES (18, 1, 22, 1, 4, 1, 8, 50, 100),
       (19, 1, 22, 1, 4, 1, 9, 100, 2300),
       (20, 2, 23, 1, 5, 1, 9, 200, 2200),
       (21, 2, 23, 1, 5, 1, 10, 100, 900),
       (22, 3, 22, 1, 4, 1, 8, 100, 0),
       (23, 3, 22, 1, 4, 1, 9, 100, 2200)
;WITH CTE
AS
(
  SELECT StudId, FeeId, [Year], MAX(Id) As MaxId
  FROM StudentFees
  GROUP BY StudId, FeeId, [Year]
)
SELECT SF.StudId, SF.[Year],
       SF.SchoolId, SF.ClassId, SF.FeeId, SF.Balance
FROM StudentFees SF
INNER JOIN CTE
   ON CTE.MaxId = SF.Id
WHERE SF.Balance > 0
| StudId | Year | SchoolId | ClassId | FeeId | Balance |
|--------|------|----------|---------|-------|---------|
|     22 |    1 |        4 |       1 |     9 |    2200 |
|     23 |    1 |        5 |       1 |     9 |    2200 |
|     23 |    1 |        5 |       1 |    10 |     900 |

你能发布你的预期结果吗?我已经解释了我的预期,最后一个带有连接的查询是为了获得学生姓名、学费姓名等,以显示给用户。我无法使用一个表(即主表feescollectors)进行查询,因此如何向您显示我的预期结果,以及多个联接和组