2015-01-23 2 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 

DESIRED ВЫВОД:

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 

Как я могу это сделать? Я хочу применить группу для определенных счетчиков с флагом. Но я также хочу получить общий счет в одном запросе!

Любые данные о том, как я могу это сделать?

+0

Я не понимаю, что агрегация вы хотите для вашего 'столбца Total', а просто сделать отдельные скопления одного и того же набора данных и присоединиться к получившиеся подзапросов , –

+0

Общая колонка с агрегацией имени. По английскому и неанглийскому языку. – Sulaiman

+0

Я сделал SUM (COUNT (ID)) OVER (PARTITION BY Name) AS total. Это решило цель. Но я пытаюсь копаться, если есть другой способ сделать это? – 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

SELECT region, flag, имя, COUNT (id) AS 'CountWithFlag', SUM (COUNT (ID)) OVER (PARTITION BY Name) AS total, FROM [dbo]. [T2] GROUP BY region, flag, name Как насчет этого запроса? Это дает мне тот же результат. Хотя я не очень уверен, что должен использовать SUm PARTITION By ?? Есть идеи? – 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 
Смежные вопросы