在 sql 服务器中创建总计行
Create a grand total row in sql server
我正在编写一个查询,其中 table 末尾应该有一个总行,它给出了 closed
、open
、reassigned columns
.
我可以做一个轴心,但不知道如何在最后放置一行。我在网上搜索过,但大多找到了创建列和行或仅创建列的解决方案。我很喜欢开发,对数据库不太了解。下面是我的支点。请让我知道我该怎么做。
select *
from
(
select [case owner] as AGENT, [final status]
from StatusTable
) src
pivot
(
count([final status])
for [final status] in ([CLOSED], [OPEN], [REASSIGNED])
) piv
当前输出如下图
这里我想要一个额外的行,如下所示。
TOTAL | 2 | 8 | 2
您可以使用 UNION ALL
连接具有相同列的行集:
with ctePivot as (
select *
from
(
select [case owner] as AGENT, [final status]
from StatusTable
) src
pivot
(
count([final status])
for [final status] in ([CLOSED], [OPEN], [REASSIGNED])
) piv
)
select * from ctePivot
union all
select 'TOTAL', sum([CLOSED]), sum([OPEN]), sum([REASSIGNED]) from ctePivot
或者只有 GROUP BY ROLLUP
的更简单的变体:
select ISNULL([case owner], 'TOTAL') as AGENT,
SUM(CASE WHEN [final status]='CLOSED' THEN 1 ELSE 0 END) [CLOSED],
SUM(CASE WHEN [final status]='OPEN' THEN 1 ELSE 0 END) [OPEN],
SUM(CASE WHEN [final status]='REASSIGNED' THEN 1 ELSE 0 END) [REASSIGNED]
from StatusTable
GROUP BY ROLLUP ([case owner]);
假设 agent
是一个关键字段,您可以对其进行汇总并使用 GROUP BY ROLLUP()
:
select coalesce(piv.agent,'Grand Total') agent
,sum(piv.closed) closed
,sum(piv.open) open
,sum(piv.reassigned) reassigned
from
(
select [case owner] as AGENT, [final status]
from StatusTable
) src
pivot
(
count([final status])
for [final status] in ([CLOSED], [OPEN], [REASSIGNED])
) piv
group by rollup(piv.agent)
如果您将查询编写为分组而不是数据透视,则可以使用 with rollup
获取总行。例如:
select
[AGENT] = case when grouping([case owner])=1 then 'TOTAL' else [case owner] end,
[CLOSED] = sum(case when [final status] = 'CLOSED' then 1 else 0 end),
[OPEN] = sum(case when [final status] = 'OPEN' then 1 else 0 end),
[REASSIGNED] = sum(case when [final status] = 'REASSIGNED' then 1 else 0 end)
from StatusTable
group by [case owner]
with rollup
我正在编写一个查询,其中 table 末尾应该有一个总行,它给出了 closed
、open
、reassigned columns
.
我可以做一个轴心,但不知道如何在最后放置一行。我在网上搜索过,但大多找到了创建列和行或仅创建列的解决方案。我很喜欢开发,对数据库不太了解。下面是我的支点。请让我知道我该怎么做。
select *
from
(
select [case owner] as AGENT, [final status]
from StatusTable
) src
pivot
(
count([final status])
for [final status] in ([CLOSED], [OPEN], [REASSIGNED])
) piv
当前输出如下图
这里我想要一个额外的行,如下所示。
TOTAL | 2 | 8 | 2
您可以使用 UNION ALL
连接具有相同列的行集:
with ctePivot as (
select *
from
(
select [case owner] as AGENT, [final status]
from StatusTable
) src
pivot
(
count([final status])
for [final status] in ([CLOSED], [OPEN], [REASSIGNED])
) piv
)
select * from ctePivot
union all
select 'TOTAL', sum([CLOSED]), sum([OPEN]), sum([REASSIGNED]) from ctePivot
或者只有 GROUP BY ROLLUP
的更简单的变体:
select ISNULL([case owner], 'TOTAL') as AGENT,
SUM(CASE WHEN [final status]='CLOSED' THEN 1 ELSE 0 END) [CLOSED],
SUM(CASE WHEN [final status]='OPEN' THEN 1 ELSE 0 END) [OPEN],
SUM(CASE WHEN [final status]='REASSIGNED' THEN 1 ELSE 0 END) [REASSIGNED]
from StatusTable
GROUP BY ROLLUP ([case owner]);
假设 agent
是一个关键字段,您可以对其进行汇总并使用 GROUP BY ROLLUP()
:
select coalesce(piv.agent,'Grand Total') agent
,sum(piv.closed) closed
,sum(piv.open) open
,sum(piv.reassigned) reassigned
from
(
select [case owner] as AGENT, [final status]
from StatusTable
) src
pivot
(
count([final status])
for [final status] in ([CLOSED], [OPEN], [REASSIGNED])
) piv
group by rollup(piv.agent)
如果您将查询编写为分组而不是数据透视,则可以使用 with rollup
获取总行。例如:
select
[AGENT] = case when grouping([case owner])=1 then 'TOTAL' else [case owner] end,
[CLOSED] = sum(case when [final status] = 'CLOSED' then 1 else 0 end),
[OPEN] = sum(case when [final status] = 'OPEN' then 1 else 0 end),
[REASSIGNED] = sum(case when [final status] = 'REASSIGNED' then 1 else 0 end)
from StatusTable
group by [case owner]
with rollup