2015-01-23 3 views
0
SELECT Region , 
     flag , 
     Name, 
     COUNT(ID) AS 'CountWithFlag' 
FROM Table 
GROUP BY flag 

이 쿼리는 다음과 같은 결과를 제공합니다. 나는 깃발별로 그룹화를하고 있으며 깃발을 기반으로 영어/영어 이외의 언어에 대한 카운트를 얻을 수 있습니다. 또한 전체 영어 카운트하고 카운트집계 및 합계

에 영어가 아닌 인접를 표시 할

출력 :

Region Flag Name  CountWithFlag 
a  0  English  100 
b  1  Non-English 200 
c  0  English  100 
d  1  Non-English 200 

원하는 출력 :

Region Flag Name  CountWithFlag Total 
a  0  English  100  200 
b  1  Non-English 200  400 
c  0  English  100  200 
d  1  Non-English 200  400 

내가 어떻게 할 수 있습니까? 나는 깃발을 가진 특정한 조사를 위해 그룹 by를 적용하고 싶다. 하지만 같은 쿼리에서 총 카운트를 얻고 싶습니다!

내가 어떻게 할 수 있는지에 대한 의견이 있으십니까?

+0

당신이 당신의'Total' 열에 원하는 집계 이해하지 않지만, 그냥 같은 데이터 세트의 별도 집계 할 그 결과 하위 쿼리에 가입 . –

+0

집계가 Name 인 총 열입니다. 영어 및 비영어권. – Sulaiman

+0

나는 SUM (COUNT (ID)) 이상 (PARTITION BY Name) 합계를했다. 그 목적을 해결했습니다. 하지만 다른 방법이 있다면 파헤 치려고합니다. – Sulaiman

답변

0

또 다른 방법은 다음과 같이 될 것이다 : 당신은 윈도우 기능을 사용하지 않도록하려면

; 
WITH agg1 
      AS (
       SELECT region, 
         flag, 
         name, 
         COUNT(id) AS 'CountWithFlag' 
       FROM [dbo].[t2] 
       GROUP BY region, 
         flag, 
         name 
       ), 
     agg2 
      AS (
       SELECT [name], 
         COUNT(id) AS CountByName 
       FROM [dbo].[t2] 
       GROUP BY [name] 
       ) 
    SELECT [agg1].[region], 
      [agg1].[flag], 
      [agg1].[name], 
      [agg1].[CountWithFlag], 
      [agg2].[CountByName] 
    FROM [agg1] 
      INNER JOIN [agg2] 
       ON [agg2].[name] = [agg1].[name] 
+0

선택 영역, 플래그, 이름, COUNT (ID) AS 'CountWithFlag', SUM (COUNT (ID)) OVER (PARTITION BY 이름) AS 합계, FROM [dbo]. [t2] GROUP BY 지역, 플래그, 이름이 쿼리는 어떻습니까? 이것은 나에게도 같은 결과를 준다. 나는 내가 SUm PARTITION을 사용해야한다고 확신하지는 않는다. ?? 어떤 아이디어? – Sulaiman

+0

나는 여전히 대부분의 경우 OVER 절을 선호하지만 항상 실행 계획을 확인하여 무엇이 더 나은지 확인해야합니다 –

0

; 
    WITH cte 
       AS (SELECT DISTINCT 
          Region , 
          flag , 
          Name , 
          COUNT(ID) OVER (PARTITION BY flag, Region, Name) AS [CountWithFlag] 
        FROM  [Table] 
       ) 
     SELECT Region , 
       flag , 
       Name , 
       SUM([CountWithFlag]) OVER (PARTITION BY Name) AS Total 
     FROM cte 
0

을하려고하면 그 작업을 수행 할 수 있습니다

SELECT 
    Region, 
    flag, 
    Name, 
    COUNT(ID) AS CountWithFlag, 
    (select count(ID) from Table as tbl1 where tbl1.Name=tbl.Name) AS Total 
from Table as tbl 
group by Region, flag, Name 

그러나 제 생각에는 창 집계가 훨씬 빠르게 작동해야한다는 것입니다.

당신이 창 집계를 사용하려면 다음을 수행하십시오

select 
    Region, 
    flag, 
    Name, 
    CountWithFlag, 
    sum(CountWithFlag) over(partition by Name) as Total 
from (
    SELECT 
    Region, 
    flag, 
    Name, 
    COUNT(ID) AS CountWithFlag 
    from Table as tbl 
    group by Region, flag, Name 
) as tbl