具有多个计数的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;