2013-05-31 8 views
0

가정하자 나는 정말로 긴 쿼리가 있습니다아날로그

select T.TipoVers As TypeVers, 
     sum(T.ImpTot) As N, 
     C.DataCalendario As Date, 
from (SELECT ...) 
group by C.DataCalendario, T.TipoVers 

이 생산 출력과 같은 :

TypeVers  N  Date 
================================ 
    Type1  1 2012-09-10 
    Type2  47 2012-09-10 
    Type3  5 2012-09-11 

내가 거의 다하지만 마지막 터치가 될 것입니다 : 행 같은 date을 문자열 값으로 연결하고 합계해야합니다 (숫자 값의 경우 - 지금은 이것이 작동하는 유일한 부분입니다). 즉

TypeVers  N  Date 
==================================== 
    Type1,Type2  48 2012-09-10 
    Type3  5  2012-09-11 

나는 여기에서 대략 XML path를 읽었다. 이 솔루션의 문제점은 많은 양의 코드입니다. (정말 긴 쿼리를 생성하는 STUFF 절에서 쿼리를 다시 작성해야합니다.) 내가 가지고있는 대안에는 어떤 것이 있습니까?

+1

을의 XML 경로 트릭은 최고의 SQL Server는 할 수있다 너를 위해서. – Andomar

+0

이 쿼리를 실행하십시오.'select group_concat (typevers), sum (N), 날짜 별 TBL 그룹의 날짜 ' – Meherzad

+3

@Mezelad 잘못된 RDBMS – AakashM

답변

2

당신은 그때 당신이 STUFF/FOR XML PATH 쿼리에 자기 참조는 할 수 있도록 CTE를 사용하여 제안 것입니다 다시 쿼리를 작성하지 않으려면 :

;with cte as 
(
    select typeVers, n, date -- your current query will go here 
    from yd 
) 
select STUFF((SELECT DISTINCT ', ' + TypeVers 
       FROM cte t 
       WHERE c.Date = t.Date 
       FOR XML PATH('')), 1, 1, '') TypeVers, 
    sum(n) n, 
    date 
from cte c 
group by date; 

SQL Fiddle with Demo

+0

+1 * 검색어는 여기에 * 표시됩니다. – hims056

+0

@bluefeet이 절이 MS SQL Server 2005에 있습니까? "왜 잘못된 구문이 근처에") "."?? –

+1

@ marianoc84 예 SQL Server 2005에서 작동합니다. – Taryn

0

를 참조하면 긴 코드를 두 번 쓸 필요가 없습니다. 당신이 공통 테이블 식으로 작업 할 XML 경로 ('') 쿼리에 대한 당신의 내면 원하는 결과 집합을 얻을 당신 정말 긴 코드 쓰기 : 불쌍 충분히

--Creates a common table expression that we can reference more than once in the select. 
WITH myLongQueryCTE AS 
(
SELECT 
ROW_NUMBER() over (order by something) AS SOME_UNIQUE_COLUMN --Put you unique column here or create a new one with row_number 
,TipoVers 
,ImpTot 
,DataCalendario 
... 
GROUP BY DataCalendario 
) 

SELECT 
STUFF((SELECT ', ' + TipoVers FROM myLongQueryCTE AS a WHERE a.SOME_UNIQUE_COLUMN = b.SOME_UNIQUE_COLUMN FOR XML PATH('')),1,1,'') as TypeVers 
,SUM(ImpTot) AS N 
,DataCalendario AS Date 
FROM myLongQueryCTE AS b