2011-01-04 8 views
0

맨 아래 행의 열 합계를 가져 오려고합니다. SUM() 및 COUNT()를 사용하여 몇 가지 예제를 시도했지만 모두 구문 오류로 인해 실패했습니다.맨 아래 행의 SQL 쿼리 합계

:XML ON 
USE MYTABLE 
SELECT sbc.PolicyC.PolicyName as namn,COUNT(*) as cnt 
FROM sbc.AgentC, sbc.PolicyC 
WHERE sbc.AgentC.PolicyGuid = sbc.PolicyC.PolicyGuid 
GROUP BY sbc.AgentC.PolicyGuid, sbc.PolicyC.PolicyName ORDER BY namn ASC 
FOR XML PATH ('celler'), ROOT('root') 
GO 

XML 출력은 일반 HTML 테이블되기 위해 다시 포맷 :

여기하는 금액 또는 아무것도없이 내 현재 코드입니다.

EDIT : 여기

최신 코드이지만, 다른 모든 행에 "합"(위의 행과 동일한 수)가 생성

:XML ON 
USE MYTABLE 
SELECT sbc.PolicyC.PolicyName as namn,COUNT(*) as cnt 
FROM sbc.AgentC, sbc.PolicyC 
WHERE sbc.AgentC.PolicyGuid = sbc.PolicyC.PolicyGuid 
GROUP BY sbc.AgentC.PolicyGuid, sbc.PolicyC.PolicyName with rollup 
FOR XML PATH ('celler'), ROOT('root') 
GO 

XML 출력 모습 이 :

<root> 
<celler> 
<namn>example name one</namn> 
<cnt>23</cnt> 
</celler> 
<celler> 
<cnt>23</cnt> 
</celler> 
<celler> 
<namn>example name two</namn> 
<cnt>1</cnt> 
</celler> 
<celler> 
<cnt>1</cnt> 
</celler> 
</root> 
+0

는 구문 오류와 함께 실패 할 경우, 오류를 게시하시기 바랍니다 너무. –

답변

1

시도

SELECT sbc.PolicyC.PolicyName as namn,COUNT(*) as cnt 
FROM sbc.AgentC, sbc.PolicyC 
WHERE sbc.AgentC.PolicyGuid = sbc.PolicyC.PolicyGuid 
GROUP BY sbc.AgentC.PolicyGuid, sbc.PolicyC.PolicyName 
UNION 
SELECT 'TOTAL' as nawn,COUNT(*) as cnt 
FROM 
FROM sbc.AgentC, sbc.PolicyC 
WHERE sbc.AgentC.PolicyGuid = sbc.PolicyC.PolicyGuid 
ORDER BY namn ASC 

이렇게하면 별도의 쿼리에서 합계가 계산됩니다. 그러나 일부 인쇄되지 않는 높은 ASCII 문자를 추가하여 총계를 강제로 낮추거나 숫자 순서 키를 추가해야 할 수도 있습니다 ... mySQL에는 연산자 (Microsoft SQL의 WITH ROLLUP와 유사)가있을 수 있습니다. 위의 코드보다 더 효율적일 것입니다 ... 그럼에도 불구하고이 방법이 효과적 일지 모르지만 여러분이 사용할 수있는 더 효율적인 옵션이 있습니다 ...

+0

FOR XML이 유니온 후에 작동 함을 확인할 수 있습니다. 적어도 내 T-SQL에서이 작업이 MySQL에서도 가능합니다. – Vlagged

1

MySQL은 그룹화 할 rollup extension을 지원합니다.

당신이 ROLLUP을 사용하는 경우, 당신은 할 수 없습니다 또한 사용 :

다음 항목는 ROLLUP의 MySQL의 구현에 특정 일부 행동 목록 :

select * from parts; 
+-----------+--------+ 
| part_name | amount | 
+-----------+--------+ 
| upper  | 100 | 
| lower  | 100 | 
| left  |  50 | 
| right  |  50 | 
+-----------+--------+ 

select part_name 
     ,sum(amount) 
    from parts 
group 
    by part_name with rollup; 

+-----------+-------------+ 
| part_name | sum(amount) | 
+-----------+-------------+ 
| left  |   50 | 
| lower  |   100 | 
| right  |   50 | 
| upper  |   100 | 
| NULL  |   300 | 
+-----------+-------------+ 
는 의견에 응답 할 업데이트 ORDER BY 절을 사용하여 결과를 정렬 할 수 있습니다. 즉, ROLLUP과 ORDER BY는 상호 배타적입니다. 그러나 여전히 정렬 순서에 대해 일부 제어 이 있습니다. 의 결과를 정렬하고 명시 적 ASC 및 DESC 키워드 GROUP BY 목록에 명명 된 열을 열에 대해 정렬 순서로 지정할 수 있습니다. (여전히 관계없이 정렬 순서의, 그들은 이 계산되는 행 후 을 표시 ROLLUP에 의해 추가 높은 수준의 요약 행.)

+1

mySQL에서 WITH ROLLUP을 지원하므로이 방법은 내가 권장하는 UNION 방식보다 나은 솔루션입니다. 고마워요 Ronnis ... mySQL이 NULL을 자동으로 정렬합니까? – Sparky

+0

"with rollup"코드를 추가했는데 구문 오류가 발생하지 않습니다. 그러나 전체 표가 요약되는 대신 셀 내의 다른 모든 행에 인쇄 된 합계가 표시됩니다. 위의 행과 같은 숫자입니다.FOR XML이 입력을 처리하는 방법과 관련이 있다고 생각합니다. 나는 이것이 실제로 어떻게 작동하는지에 대해 매우 제한적인 지식을 갖고 있으며, 어떻게 진행해야할지 모르겠습니다. 그러나 나는 원래 게시물에 최신 결과를 게시했습니다. – jman

+0

@nctrnl, 나는 FOR XML을 사용한 적이 없기 때문에 나는 모른다 : – Ronnis