#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]