2014-09-08 1 views
-1

두 테이블의 StudentMaster 및 StudentQualificationDetalis가 있으며 다음과 같은 데이터가 있습니다. enter image description here두 개의 테이블을 결합 할 때 '그룹화'를 사용하는 방법

MarksPercentage 열은 VARCHAR

I need result like- 
details of students who have AdmissionBase = 10+2 and 
Get the number of students in AdmissionBase having percentage 50% - 60% and 
61% - 70% and 
71% - 80% and 
81% - 90% and 
91% - 100% 

내가 IS-

**AdmissionBase   Percentage   NumberOfStudents** 
10+2      50% - 60%   3 
10+2      61% - 70%   2 

위 그냥 예입니다 원하는 결과의 예이다. 표의 기록은 다를 수 있습니다. 여기

내가
SELECT   sm.AdmissionBase, 
       (
       CASE 
       WHEN sq.MarksPerecent IS NULL OR sq.MarksPerecent = '' THEN 'Not Known' 
       WHEN CONVERT(DECIMAL, sq.MarksPerecent) >= 50 AND CONVERT(DECIMAL, sq.MarksPerecent) <= 60 THEN '50% - 60%' 
       WHEN CONVERT(DECIMAL, sq.MarksPerecent) >= 61 AND CONVERT(DECIMAL, sq.MarksPerecent) <= 70 THEN '61% - 70%' 
       WHEN CONVERT(DECIMAL, sq.MarksPerecent) >= 71 AND CONVERT(DECIMAL, sq.MarksPerecent) <= 80 THEN '71% - 80%' 
       WHEN CONVERT(DECIMAL, sq.MarksPerecent) >= 81 AND CONVERT(DECIMAL, sq.MarksPerecent) <= 90 THEN '81% - 90%' 
       WHEN CONVERT(DECIMAL, sq.MarksPerecent) >= 91 AND CONVERT(DECIMAL, sq.MarksPerecent) <= 100 THEN '91% - 100%' 
       ELSE 'Below 50%' 
       END 
       )Percentage, 
       COUNT(*) 
FROM   StudentMaster sm, StudentQualificationDetails sq 
where   sm.registerationnumber = sq.registerationnumber 
and    sm.AdmissionBase = sq.ExamDescription 
and    sm.admissionbase = '10+2' 
group by percentage 

을 시도했지만 그것이 나 오류 - 잘못된 열 이름 '비율'을주는 것입니다.

감사합니다.

+0

죄송합니다. 연락 드릴 수 없습니다. – kamalpreet

+0

질문을 던지고 질문을하기 전에 문제를 해결하려고 시도해야합니다. – Ram

+0

좋아, 나는 하루 종일이 일을 낭비했지만 아무 것도 효과가 없었습니다. 나는 몇 분 안에 내 시도를 게시 할 것입니다. – kamalpreet

답변

1

는 조프가 제공하는 것보다 단순화 된 버전입니다. 그것은 조인을 위해 함께 작업 할 테이블에 의해 자체 생성 된 그룹을 사용합니다. 조인은> = 및 < 컨텍스트를 기반으로하기 때문에 101 퍼센트의 마지막 항목이 있습니다.

SELECT 
     sm.AdmissionBase, 
     PctRanks.Grp, 
     COUNT(*) as TotalPerGroup 
    from 
     StudentMaster sm 
      JOIN StudentQualificationDetails sqd 
      ON sm.RegistrationNumber = sqd.RegistrationNumber 
      JOIN (select 'Less than 50%' as Grp, 0 as AtLeast, 50 as LessThan 
        UNION select '50% - 60% ', 50, 61 
        UNION select '61% - 70% ', 61, 70 
        UNION select '71% - 80% ', 71, 80 
        UNION select '81% - 90% ', 81, 90 
        UNION select '91% - 100% ', 91, 101) PctRanks 
       ON sqd.MarksPercent >= PctRanks.AtLeast 
       AND sqd.MarksPercent < PctRanks.LessThan 
    where 
     sm.AdmissionBase = '10+2' 
    group by 
     sm.AdmissionBase, 
     PctRanks.Grp 

요청별로 설명됩니다. 먼저, Zoff가 제공하는 것처럼 테이블을 만들 수 있지만 더 작은 목적의 테이블을 인라인으로 처리하는 것을 선호합니다. 따라서 (쿼리) PctRanks로 래핑 된 쿼리가이 인라인을 수행합니다. "AS"열 이름을 사용하여 간단한 값 선택을 수행하면 1 행을 의미합니다. 서로 결합하여 동일한 결과 세트에 추가 행을 작성합니다. PctRanks 결과 집합 "Grp", AtLeast 및 LessThan 열 및 6 행 결과.

다음으로 석사 과정 학생 명단부터 시작하십시오. 특정 입학 기반을 가진 사람들에 대해서만 신경을 쓰고 WHERE 절은 독자적으로 단순해야합니다.

이제는 혼합입니다. 학생 마스터는 "sm"(AdmissionBase = '10 +2 '만 해당)의 별칭을 지정하고 가독성을 단순화하기 위해 "sqd"라는 별칭을 가진 StudentQualificationDetails 테이블에 가입합니다. 가입은 학생의 등록 번호를 기반으로합니다. 마지막으로, sqd 항목에서 MarksPercent가 수집에 관련된 두 개의 숫자 범위의 범위 내에있는 임시 결과 세트 "PctRanks"에이를 결합하십시오.

마지막 열은 입학 기반, % 범위에 대한 문자 설명 및 일반 COUNT (*)를 얻는 것이 었습니다. count(), min(), max(), avg(), sum())와 같은 집계 함수를 수행 한 후 엔진은 공통 요소 (따라서 % 그룹 레이블)를 적용하는 방법을 알아야합니다.

+1

음. 이것은 정말로 효과가 있었다! 정말 고마워. 그러나 실제로 당신이 여기에서하려고하는 것을 이해하지 못했습니다. 설명해 주시겠습니까? – kamalpreet

+1

@kamalpreet, 수정 된 답변은 도움이됩니다. – DRapp

1

밴드를 보관할 테이블이 필요합니다. 이

DECLARE @PercentageBand TABLE 
(
    MinPercent float, 
    MaxPercent float, 
    BandName  varchar(10) 
) 

INSERT INTO @PercentageBand 
    VALUES (0, 10,'0 - 9.9%'), 
      (10, 20, '10% - 19.9%') 
      (etc.) 

비슷해 그리고 다른 두 사람과 함께이 테이블에 대해 조인 다음

SELECT  M.AdmissionBase, 
      B.BandName, 
      COUNT(m.RegistrationNumber) AS NumberOfStudents 
FROM  StudentMaster    M 
INNER JOIN StudentQualificationDetails D ON M.RegistrationNumber = D.RegistrationNumber 
INNER JOIN @PercentageBand    B ON D.MarksPercent >= B.MinPercent 
             AND D.MarksPercent < B.MaxPercent 
GROUP BY M.AdmissionBase, 
      B.BandName 
0

즉석에서 Range를 계산하는 것으로 생각하십니까? (10으로 나누고 분수를 잘라서)? GROUP BY 명세서에도 사용할 수 있습니다.

SELECT 
    sm.AdmissionBase, 
    Floor(sqd.MarksPercent/10) AS Percentage, 
    COUNT(sm.RegistrationNumber) AS NumberOfStudents 
FROM StudentMaster sm 
INNER JOIN StudentQualificationDetails sqm ON (sm.RegistrationNumber = sqm.RegistrationNumber) 
WHERE 
    sm.AdmissionBase = "10+2" 
GROUP BY sm.AdmissionBase, FLOOR(sqd.MarksPercent/10) 
+1

MarksPercent 열이 varchar입니다. – kamalpreet

+0

농담입니까? 왜? 그렇다면 Varchar에서 Float 로의 변환을 추가 할 수 있습니다. 매우 간단하지만 대부분 DBMS에만 해당됩니다. Google이 도움을줍니다. –

관련 문제