단일 테이블 및 조인에 대한 2 개 또는 3 개의 그룹 기준을 사용하는 SQL의 복잡한 그룹화

3333

이것은 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

특정 StudIdFeeIdBalance 가 최소이지만 0이 아닌 행을 원합니다 . 실제로 사용자에게 보류중인 수수료를 표시하고 싶습니다. 즉,이 학생은 이번 학년도에이 수수료 유형의 잔액이이 정도 남아 있습니다. 당신이 행을 관찰하면 아이디 (18)StudId (22)8 FeeId밸런스 (100) , 지금과 행 이드가 22 개잔액 0 의 모든 비용 지불이 (22) 학생을 의미 같은 학생들과 같은 수수료와 8 FeeId을 내가 원하는하지 않도록, 이 학생은 FeeId 8 입니다. 이제 동일한 학생이 FeeId 9로 수수료를 지불 했습니다.ID 19 (23) 와 두 가지가 균형 2300 및 2200을 나는 것을 보여주고 싶은, 그래서 StudId (22)밸런스 남은 2200을 FeeId 9 내가 가진 행 보여주고 싶은 의미 아이디 (23)NOT 으로 행을 아이디 19 . 이제 이것은 그들이 가지고있는 수수료 ID에 관계없이 모든 학생들에게 적용됩니다.

나는 이것을 시도했지만 얻지 못했습니다.

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
스티브 포드

이건 어때:

SQL 바이올린

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)

쿼리 1 :

;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 |

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관