具有多个计数的Sql pivot
我有以下疑问:具有多个计数的Sql pivot,sql,Sql,我有以下疑问: select distinct (SELECT COUNT (TaskID) FROM Task, Employee where SupervisorID = '752A0F4D-9905-4D55-87F1-AFA19245C206' and task.UserID = Employee.UserID) as Total, (SELECT COUNT (TaskID) FROM Task, Employee where SupervisorID = '752A0F4D-9
select distinct
(SELECT COUNT (TaskID) FROM Task, Employee where SupervisorID = '752A0F4D-9905-4D55-87F1-AFA19245C206' and task.UserID = Employee.UserID) as Total,
(SELECT COUNT (TaskID) FROM Task, Employee where SupervisorID = '752A0F4D-9905-4D55-87F1-AFA19245C206' and task.UserID = Employee.UserID and DateDue <= DATEADD(day,-1, GETDATE()) )as TotalOverdue,
(SELECT COUNT (TaskID) FROM Task, Employee where SupervisorID = '752A0F4D-9905-4D55-87F1-AFA19245C206' and task.UserID = Employee.UserID and DateDue >= DATEADD(day,-1, GETDATE()) ) as Totaldue
from Task
但是,我希望它的格式如下:
Total: 5
TotalOverdue: 4
TotalDue: 1
我试过使用pivot函数,但不能真正让它正常工作。有什么想法吗?我想你可以通过条件聚合做你想做的事情:
select count(*) as Total,
sum(case when DateDue <= DATEADD(day, -1, GETDATE()) then 1 else 0
end) as TotalOverdue,
sum(case when DateDue >= DATEADD(day, -1, GETDATE()) then 1 else 0
end) as TotalDue
from Task join
Employee
on task.UserID = Employee.UserID
where SupervisorID = '752A0F4D-9905-4D55-87F1-AFA19245C206';
选择count(*)作为总计,
求和(DateDue=DATEADD(day,-1,GETDATE())时的大小写为1,否则为0
(完)到期
从任务加入
雇员
在task.UserID=Employee.UserID上
其中SupervisorID='752A0F4D-9905-4D55-87F1-AFA19245C206';
如果你想让所有的主管都知道
select SupervisorID, count(*) as Total,
sum(case when DateDue <= DATEADD(day, -1, GETDATE()) then 1 else 0
end) as TotalOverdue,
sum(case when DateDue >= DATEADD(day, -1, GETDATE()) then 1 else 0
end) as TotalDue
from Task join
Employee
on task.UserID = Employee.UserID;
选择SupervisorID,将(*)计算为总数,
求和(DateDue=DATEADD(day,-1,GETDATE())时的大小写为1,否则为0
(完)到期
从任务加入
雇员
on task.UserID=Employee.UserID;
编辑:
你真的想取消填充数据。这里有一种方法:
select n.which,
(case when n.which = 'Total'
then count(*)
when n.which = 'TotalOverdue'
then sum(case when DateDue <= DATEADD(day, -1, GETDATE()) then 1 else 0
end)
else sum(case when DateDue >= DATEADD(day, -1, GETDATE()) then 1 else 0
end)
end) as value
from Task join
Employee
on task.UserID = Employee.UserID cross join
(select 'Total' as which union all 'TotalOverdue' union all 'TotalDue') n
group by n.which;
选择n,
(n.which='Total'时的情况)
然后计数(*)
当n.which='total逾期'
然后求和(DateDue=DATEADD(day,-1,GETDATE())时的大小写为1,否则为0
(完)
结束)作为值
从任务加入
雇员
在task.UserID=Employee.UserID交叉联接上
(选择“Total”作为联合所有“TotalOverside”联合所有“TotalDue”)n
按n.which分组;
如果您想要一列是字符串,请使用
concat()
您正在查找运算符…我尝试使用union all运算符,但结果只是在一列中包含数据,但无法查看哪一行属于哪一列。您的函数工作得很好,但它无法透视数据。它提供与以前相同的输出。
select n.which,
(case when n.which = 'Total'
then count(*)
when n.which = 'TotalOverdue'
then sum(case when DateDue <= DATEADD(day, -1, GETDATE()) then 1 else 0
end)
else sum(case when DateDue >= DATEADD(day, -1, GETDATE()) then 1 else 0
end)
end) as value
from Task join
Employee
on task.UserID = Employee.UserID cross join
(select 'Total' as which union all 'TotalOverdue' union all 'TotalDue') n
group by n.which;