2016-07-12 6 views
0

보고서를 만들려면보기를 만들려는 다음 열이있는 테이블이 있습니다. 특정 클래스의 완료 시간 합계를 가져야합니다. 특정 필터 : 다음 필터를 적용하는 동안합계, 복수 그룹화 필터 함께

| PK_CLASS_DAYS_ID | FK_MAIN_ID | FK_CLASS_ID | CLASS_DAY | OUTCOME | CLASS_DATE | HOURS | 
|------------------|------------|-------------|-----------|---------|------------|-------| 
| 1    | 27452  | 137   | 1   | *15  | 2015-11-15 | 8  | 
| 2    | 27452  | 137   | 2   | *15  | 2015-11-16 | 8  | 
| 3    | 27452  | 137   | 4   | *15  | 2015-11-18 | 8  | 
| 4    | 27452  | 137   | 5   | BS15 | 2015-11-19 | 8  | 
| 5    | 27452  | 2   | 1   | *16  | 2001-01-01 | 8  | 
| 6    | 27452  | 48   | 1   | *16  | 2016-01-12 | 8  | 
| 7    | 27452  | 48   | 2   | *16  | 2016-02-27 | 4  | 
| 8    | 27452  | 2   | 1   | *17  | 2017-07-01 | 8  | 
| 9    | 27452  | 137   | 1   | *16  | 2016-07-16 | 8  | 

내 테이블의 모든 학생에게 각 클래스 (FK_CLASS_ID) 완료 시간의 합계를 찾을 필요는 (현재 내가 테스트 목적으로 ID 27452로 필터링 한) 각 클래스 (FK_CLASS_ID) :

  • (1) CLASS_DAY는 구별되어야
  • (2) CLASS_OUTCOME는 "*"
  • (3) CLASS_DATE은 가장 최근 있어야합니다 여전히 앞의 두 조건을하면서로 시작해야합니다.
| PK_CLASS_DAYS_ID | FK_MAIN_ID | FK_CLASS_ID | Hrs | 
|------------------|-------------|--------------|------| 
| 1    | 27452  | 137   | 32 | 
| 2    | 27452  | 2   | 8 | 
| 3    | 27452  | 48   | 12 | 

나는 이러한 목표를 달성하기 위해 노력하고 함께 왔 먼은 다음 select 문입니다 :

SELECT 
t1.CLASS, 
SUM(class_hours) as Hrs, 
GROUP_CONCAT('D',classes_days.class_day) as DaysList, 
main.FULLNAME 
FROM 
classes t1 
INNER JOIN classes_days ON classes_days.FK_CLASS_ID = t1.CLASS_ID 
INNER JOIN main ON main.PK_MAIN_ID = classes_days.FK_MAIN_ID 
WHERE 
main.PK_MAIN_ID = 27452 
GROUP BY FK_CLASS_ID 
ORDER BY CLASS 
+0

보유한 성명서의 문제점을 설명해 주시겠습니까? – Mureinik

+1

태그를 지정할 때주의해야합니다. SQL 서버 <> mysql. 태그를 수정 하겠지만 지금 보류중인 수정 사항이 있습니다. –

+0

현재 FUS_CLASS_ID에 대해 CLASS_DAY가 같은 행이 두 개있는 경우 현재 명령문에서 고유 CLASS_DAY 열을 고려하지 않으며 가장 최근 날짜 만 추가하지 않습니다. 또한 별표로 시작하는 OUTCOME 컬럼이있는 행만 추가해야합니다. 이것은 MySQL v5.6 용입니다. – Gustavo1478

답변

0

당신이 원하는하는지 들어 다음과 같은 결과보기는해야한다 달성하려면 원하는 합계 쿼리로 조인을 필터링하고 검색된 레코드 세트의 원하는 조건에 조인을 제공해야합니다.

SELECT 
`t1`.`CLASS`, 
SUM(`class_hours`.`HOURS`) AS `Hrs`, 
GROUP_CONCAT('D', `class_hours`.`CLASS_DAY` ORDER BY `class_hours`.`CLASS_DAY`) AS `DaysList`, 
`main`.`FULLNAME` 
FROM `classes` AS `t1` 
INNER JOIN (
    #Filter the total hours by student, class, and day 
    SELECT `class_dates`.`FK_MAIN_ID`, `class_dates`.`CLASS_DAY`, `class_dates`.`FK_CLASS_ID`, SUM(`class_dates`.`HOURS`) as `HOURS` 
    FROM (
     #Filter Most Recent Days beginning with star, by most recent date 
     SELECT `classes_days`.* 
     FROM `classes_days` 
     WHERE `classes_days`.`OUTCOME` LIKE '*%' 
     ORDER BY `CLASS_DATE` DESC 
    ) AS `class_dates` 
    GROUP BY `class_dates`.`FK_MAIN_ID`, `class_dates`.`CLASS_DAY`, `class_dates`.`FK_CLASS_ID` 
) AS `class_hours` 
ON `class_hours`.`FK_CLASS_ID` = `t1`.`CLASS_ID` 
INNER JOIN `main` 
ON `main`.`PK_MAIN_ID` = `class_hours`.`FK_MAIN_ID` 
GROUP BY `class_hours`.`FK_MAIN_ID`, `class_hours`.`FK_CLASS_ID` 
ORDER BY `FULLNAME`, `CLASS`; 

이 결과 : 같은

하여 제공하는 쿼리 및 원하는 결과를 그만 내놓고, 그것은 보일 것

| CLASS | Hrs | DaysList | FULLNAME | 
|---------|-----|-------------|----------| 
| History | 8 |   D1 |  Joe | 
| Math | 32 | D1,D2,D4 |  Joe | 
| Science | 12 |  D1,D2 |  Joe | 
| Math | 10 |  D1,D2 |  Mike | 

예 : 테이블의 http://sqlfiddle.com/#!9/d5828/1

원래 쿼리 최상위 검색어입니다. 부속 조회 조인 예제는 맨 아래 조회 결과입니다. PK_MAIN_ID 기준을 제거하는 것은 염두에 두어야 마십시오 여러 항목

를 상대로 작업을 보여 그 MySQL의 GROUP BY + ORDER BY 항상 원하는 결과를 산출하지 않고, 순서대로 조인 하위 쿼리에서 입증 된 하위 쿼리를 사용하여 필터링해야 *로 시작하는 최신 날짜를 얻으려면.

+0

와우! 그 성명서는로드 된 것처럼 보이며, 그것을 읽고 이해하는 데 시간이 걸릴 것입니다. 일단 내가 그것을 나의 상황에 적용하고 그 결과를 다시보고 할 것이다. 답장을 보내 주셔서 감사합니다. 매우 감사드립니다. – Gustavo1478

+0

# 별표로 시작하는 가장 최근의 일, 가장 최근 날짜로 섹션의 모든 레코드를 선택하는 대신 원래의 성명을 수정하여 원하는 결과를 얻었습니다. 내가 선택한 특정 열을 모두 선택하는 대신 DISTINCT를 사용했습니다. 예상대로 작동합니다. 감사합니다.나는이 문장을 내가 필요로하는대로 작동시키기 위해이 견해를 여러 견해로 나누어야한다고 생각한다. – Gustavo1478

+0

성명서의 모든 입력란에 작은 따옴표가있는 것을 볼 수는 없지만 그 이유는 무엇입니까? 차이가 있습니까? – Gustavo1478