Объединение группы по столбцам по вертикали

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

У меня есть несколько групп по запросам, которые мне нужно объединить по горизонтали. Вот что у меня есть.

введите описание изображения здесь

Вот что мне нужно. Это выполнимо?

введите описание изображения здесь

 select 
    Group, 
    Count([Total # Records]
from table 

select 
    Group, 
    Count([Total # Records]
from table 
where 
[Date] < DATEADD(DAY, -60, getdate())
 

Ответ №1:

Используйте условную агрегацию:

 select Group, Count([Total # Records]),
       sum(case when [Date] < DATEADD(DAY, -60, getdate() then 1 else 0 end)
from table 
group by group;
 

Комментарии:

1. @user716255 . . . Есть ли причина, по которой вы не использовали этот метод и не приняли этот ответ? Это кажется намного проще, чем использование pivot .

Ответ №2:

Вы можете использовать условную агрегацию с помощью COUNT агрегатной функции следующим образом:

 select group, 
       count([Total # Records]),
       count(case when [Date] < DATEADD(DAY, -60, getdate()) then 1 end)
from table 
group by group;
 

COUNT будет игнорировать значения null, создаваемые условиями, поэтому будет указано количество записей, удовлетворяющих условию.

Ответ №3:

Ниже приведен сценарий решения, которое я в конечном итоге использовал. Полную рабочую копию и образцы данных можно найти на Fiddle

введите описание изображения здесь

  ;with table1CTE 
as
(   
    select 
        [Groups], 
        sum([total # records]) as [total # records]
    from 
        tbl1
where 
    [Groups] 
in 
    (
        select 
            [groups]    
        from 
        (
        select  
            [groups],
            [total # records]
        from 
            tbl1
        ) as sourceTbl1
        pivot
        (sum ([total # records])
            for [groups]
            in
            ([Central Business],
            [Venture Capital])
        ) as pvt
    )
    group by [groups]
),--table1CTE 
table2CTE  as
(
    select 
        [Groups], 
        sum([No Action Over 60 Days]) as [No Action Over 60 Days]
    from 
        tbl2
where 
    [Groups] 
in 
    (
        select 
            [groups]    
        from 
    (
        select  
            [groups],
            [No Action Over 60 Days]
        from 
            tbl1
    ) as sourceTbl1
        pivot
        (sum ([No Action Over 60 Days])
            for [groups]
            in
            ([Central Business],
            [Venture Capital])
        ) as pvt
    )
    group by [groups]
)--table2CTE 
select 
    table1CTE.groups, 
    table1CTE.[total # records], 
    table2CTE.[No Action Over 60 Days]

from table1CTE  left join table2CTE on table1CTE.[Groups] = table2CTE.[Groups]