2013-03-06 5 views
1

여기에 SQL Fiddle에서 table 샘플이 있습니다.전체 열을 얻는 방법

CREATE TABLE my_table 
(id INT NOT NULL AUTO_INCREMENT UNIQUE, 
    Shot VARCHAR(4), 
    sec varchar(5), 
    lay VARCHAR(15) NOT NULL, 
    lay_status VARCHAR(15) NOT NULL, 
    blk VARCHAR(10) NOT NULL, 
    blk_status VARCHAR(15) NOT NULL, 
    pri VARCHAR(10) NOT NULL, 
    pri_status VARCHAR(15) NOT NULL, 
    ani VARCHAR(10) NOT NULL, 
    ani_status VARCHAR(15) NOT NULL, 
    status VARCHAR(5) 
); 

INSERT INTO my_table VALUES 
(1,'SH01','3','1863','yes','1863','yes','P4645','yes','P4557','yes','Over'), 
(2,'SH02','2.5','1863','yes','P4645','no','P4557','yes','1863','no','Over'), 
(3,'SH03','0.5','P4645','yes','P4557','yes','1863','yes','1863','yes','WIP'), 
(4,'SH04','1.25','1863','no','P4645','no','P4557','yes','1863','yes','RTK'), 
(5,'SH05','1','1863','yes','1863','yes','P4645','yes','P4557','yes','WIP'), 
(6,'SH06','6','P4557','yes','P4645','yes','P4645','yes','P4557','yes','WIP'); 

아래의 SQL을 사용하여 Shots of lay=1863을 검색했습니다. 초의 합계를 얻으십시오.

부 결과가 잘못되었습니다. 아무도 나를 인도 할 수 있을까?

SELECT 
    IFNULL(Shot,'TOTAL') AS Shot 
    , sec 
    , lay 
FROM my_table 
where lay='1863' 
group by shot with rollup; 

(SEC 컬럼에 대한) 전체의 결과는 이제 1

SHOT SEC  LAY 
SH01 3  1863 
SH02 2.5  1863 
SH04 1.25 1863 
SH05 1  1863 
TOTAL 7.75  
+0

무슨 뜻입니까? 어떤 결과를 원하니? –

+0

예상되는 결과는 무엇입니까? –

답변

2

문제가 집계 기능없이 GROUP BY를 사용하는 것이다를 도시 7.75이어야한다. 현재 쿼리에서는 롤업 할 열인 sec 열에서 sum()을 사용하지 않습니다. 사용해보기 :

SELECT 
    coalesce(Shot,'TOTAL') AS Shot 
    , sum(sec) Sec 
    , min(lay) lay 
FROM my_table 
where lay='1863' 
group by shot with rollup; 

SQL Fiddle with Demo을 참조하십시오.

현재 쿼리가 집계를 수행하지 않아서 최종 롤업 행이 올바르지 않습니다.

당신은 내가 집계 함수에 lay 열을 배치 알 수 있습니다. 대부분의 데이터베이스 제품에서는 선택 목록의 열이 집계 함수의 내부 또는 group by에 포함되지 않도록 제외되기 때문입니다.

Extension to GROUP BY이기 때문에 MySQL에서 허용됩니다. MySQL의 문서에서

:

MySQL은 SELECT 목록에 GROUP BY 절에 이름이 없습니다 집계되지 열을 참조 할 수 있도록 BY GROUP의 사용을 확장합니다. ...이 기능을 사용하면 불필요한 열 정렬 및 그룹화를 피하면서 더 나은 성능을 얻을 수 있습니다. 그러나 이것은 GROUP BY에 이름이 지정되지 않은 각 집계되지 않은 열의 모든 값이 각 그룹에 대해 동일 할 때 주로 유용합니다. 서버는 각 그룹에서 임의의 값을 자유롭게 선택할 수 있으므로 동일하지 않으면 선택된 값이 불확실합니다. 또한 각 그룹의 값 선택은 ORDER BY 절을 추가하여 영향을받을 수 없습니다. 결과 세트 정렬은 값을 선택한 후에 발생하며 ORDER BY는 서버가 선택하는 값에 영향을주지 않습니다.

편집 : 마지막 행의 lay 열의 결과를 숨기려면, 당신은 사용할 수 있습니다

SELECT 
    coalesce(Shot,'TOTAL') AS Shot 
    , sum(sec) Sec 
    , case when shot is not null then min(lay) else '' end lay 
FROM my_table 
where lay='1863' 
group by shot with rollup; 

SQL Fiddle with Demo

+0

UI가 필요 없다고 생각합니다.왜 그걸 사용했는지 말해 줄 수 있어요. 개미, 새로운 함수'coalesce'를 배웠던 해답을 고맙다. – Rao

+0

@PBLNarasimhaRao MySQL은 집합체에 있어야한다고 요구하지는 않지만 집계를 추가하여이 쿼리가 MySQL 외부에서 작동하도록했습니다. :) – Taryn

+0

7.75 옆의 마지막 열 (lay)에 1863이 표시됩니다. 표시하고 싶지 않습니다. 그것을 피하는 방법을 말할 수 있습니까? – Rao

0

이 ::

SELECT  
    Shot, 
sec, 
lay 
    FROM my_table 
    where lay='1863' and Shot is not null 
    group by shot with rollup 

    UNION 

    SELECT 
    'TOTAL' AS Shot, 
SUM(sec), 
lay 
FROM my_table 
where lay='1863' 
group by shot with rollup 
을 시도하십시오
3

원하는만큼이 검색어 사용

SELECT 
    Shot 
    , sum(sec) 
FROM my_table 
where lay='1863' 
group by shot with rollup; 

GROUP BY 절은 WITH ROLLUP 수정자가 추가 행을 요약 출력에 추가하도록합니다. 이 행은

당신이 합을 요청해야 초간의 합을 원하는 경우 http://dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.html

1

GROUP BY는 집계을위한 참조 높은 수준 (또는 슈퍼 집계) 요약 작업을 나타냅니다.

SELECT 
    IFNULL(Shot,'TOTAL') AS Shot 
    , sum(sec) 
    , max(lay) 
    FROM my_table 
    WHERE lay='1863' 
    GROUP BY shot WITH ROLLUP; 

http://sqlfiddle.com/#!2/1f61b/49

+0

7.75 옆의 마지막 행 (lay)에 1863이 표시됩니다. 표시하고 싶지 않습니다. . 그것을 피하는 방법을 말할 수 있습니까? – Rao

+0

@PBLNarasimhaRao는'max (lay)'를'(MAXASE)가 끝나면 NULL이 아닌 경우 '로 대체합니다. –

1

노력이

DEMO HERE

당신이 총에 총 어쩌면 당신은 또한 계산 얼마나 많은 필드 때문에 얼마나 많은 행이 카운트를 고려할 수 있습니다 편집 거기있다. 당신이 비어있을하려는 경우 그

SELECT 
IFNULL(Shot,'TOTAL') AS Shot 
, sum(sec) as sec 
, if(Shot is null , count(*) , lay) lay 
FROM my_table 
where lay='1863' 
group by shot with rollup; 

DEMO HERE

처럼 그냥 ''

+0

7.75 옆의 마지막 열 (마지막)에 1863이 표시됩니다. 표시하고 싶지 않습니다. 그것을 피하는 방법을 말할 수 있습니까? – Rao

+0

내 편집 된 답변을 보면 –

+0

이 도움이 될 수 있습니다. 왜냐하면 TOTAL의 개수를 계산하면 더 좋습니다. –

1

Here에 의해 count(*)을 대체 그룹에 대한 기능을 내장 MySQL의 목록 집계

AVG() Return the average value of the argument 
BIT_AND() Return bitwise and 
BIT_OR() Return bitwise or 
BIT_XOR()(v4.1.1) Return bitwise xor 
COUNT(DISTINCT) Return the count of a number of different values 
COUNT() Return a count of the number of rows returned 
GROUP_CONCAT()(v4.1) Return a concatenated string 
MAX() Return the maximum value 
MIN() Return the minimum value 
STD() Return the population standard deviation 
STDDEV_POP()(v5.0.3) Return the population standard deviation 
STDDEV_SAMP()(v5.0.3) Return the sample standard deviation 
STDDEV() Return the population standard deviation 
SUM() Return the sum 
VAR_POP()(v5.0.3) Return the population standard variance 
VAR_SAMP()(v5.0.3) Return the sample variance 
VARIANCE()(v4.1) Return the population standard variance 
입니다

나는 SUM()을 원한다고 믿는다.

은 전혀 사용이 정확하지 보이는 '누워'TOTAL 행의 열을

SELECT 
IFNULL(Shot,'TOTAL') AS Shot 
,SUM(sec) AS sec 
, lay 
FROM my_table 
where lay='1863' 
group by shot with rollup; 
+0

마지막 행 7.75 옆의 마지막 열 (lay)에 1863이 표시됩니다. 표시하고 싶지 않습니다. 그것을 피하는 방법을 말할 수 있습니까? 를 탄 같이 총 '다음 분 (배치) 다른 널이 아닌 경우 – Rao

+0

'= 배치 여기서 단부 MY_TABLE FROM 누워 '('총 '촬영)을 선택 그것을 합 (초) 초 , 케이스 병합을 사용해 1863 ' 롤업으로 촬영 한 그룹 수, –

1

보십시오. 그 여기 제외하면 결과를 예상 줄 것이다 SQL이다 :

경우 또한
SELECT Shot, sec, lay FROM my_table WHERE lay = '1863' 
UNION 
SELECT 'TOTAL' AS Shot, SUM(sec), '' AS lay FROM my_table WHERE lay = '1863'; 

경우 열 '샷'은 다음 질의 사용할 수있을 것입니다 예에서와 같이 테이블 내에서 고유해야합니다

SELECT t1.Shot, t1.sec, t2.lay FROM 
    (
    SELECT IFNULL(Shot, 'TOTAL') AS Shot, SUM(sec) As sec 
    FROM my_table 
    WHERE lay = '1863' 
    GROUP BY Shot WITH ROLLUP 
    ) t1 
LEFT JOIN my_table t2 
ON(t1.Shot = t2.shot); 

그리고 어떤 경우에도 작동하는 해결책은 다음과 같습니다.

SELECT t1.Shot, t1.sec, t1.lay FROM 
    (
    SELECT IFNULL(Shot, 'TOTAL') AS Shot, SUM(sec) as sec, lay 
    FROM my_table 
    WHERE lay = '1863' 
    GROUP BY Shot, lay WITH ROLLUP 
    ) t1 
WHERE t1.lay IS NOT NULL OR t1.Shot = 'TOTAL'; 
+0

코드로 게시 할 때 {code as format} 버튼 {}을 사용하는 것을 잊지 마십시오. – Raad

관련 문제