繁体   English   中英

SQL:来自同一表的多个计数

[英]SQL: multiple counts from same table

我在尝试查询所需数据时遇到了一个真正的问题。 我尝试了几种方法但均未成功。 我可以通过4个独立的查询来获取数据,只是无法将数据放入1个查询中。 所有数据均来自1个表。 我将列出尽可能多的信息。

我的数据看起来像这样。 我有一个customerID和3列,用于记录谁为该客户以及分配的acct经理处理了该记录

 RecID_Customer___CreatedBy____LastUser____AcctMan

 1-------1374----------Bob Jones--------Mary Willis------Bob Jones

 2-------1375----------Mary Willis------Bob Jones--------Bob Jones

 3-------1376----------Jay Scott--------Mary Willis-------Mary Willis

 4-------1377----------Jay Scott--------Mary Willis------Jay Scott

 5-------1378----------Bob Jones--------Jay Scott--------Jay Scott

我希望查询返回以下数据。 有关如何获取每种内容的说明,请参见下文。

Employee___Created__Modified__Mod Own__Created Own 

 Bob Jones--------2-----------1---------------1----------------1

 Mary Willis------1-----------2---------------1----------------0

 Jay Scott--------2-----------1---------------1----------------1

已创建=计算每个员工创建的记录数

已修改=员工被列为“最后用户”的记录数(他们创建记录的位置除外)

Mod Own = LastUser = Acctman(客户经理)时每个记录的数量

已创建的自己=员工所在客户的经理创建的记录数

我可以从查询中获取所有这些,只需要以某种方式将它们组合起来即可:

Select CreatedBy, COUNT(CreatedBy) as Created
FROM [dbo].[Cust_REc] GROUP By CreatedBy

Select LastUser, COUNT(LastUser) as Modified
FROM [dbo].[Cust_REc] Where LastUser != CreatedBy GROUP By LastUser

Select AcctMan, COUNT(AcctMan) as CreatePort
FROM [dbo].[Cust_REc] Where AcctMan = CreatedBy GROUP By AcctMan

Select AcctMan, COUNT(AcctMan) as ModPort
FROM [dbo].[Cust_REc] Where AcctMan = LastUser AND NOT AcctMan = CreatedBy GROUP By AcctMan

有人可以看到一种方法吗? 我可能必须将表自身连接起来,但是我的尝试没有给我正确的数据。

以下内容将为您提供所需的结果。

select 
    e.employee,
    create_count=(select count(*) from customers c where c.createdby=e.employee),
    mod_count=(select count(*) from customers c where c.lastmodifiedby=e.employee),
    create_own_count=(select count(*) from customers c where c.createdby=e.employee and c.acctman=e.employee),
    mod_own_count=(select count(*) from customers c where c.lastmodifiedby=e.employee and c.acctman=e.employee)
from (
    select employee=createdby from customers
    union
    select employee=lastmodifiedby from customers
    union
    select employee=acctman from customers
) e

注意:还有其他方法比这更有效,但也可能更复杂。 具体来说,我敢打赌某个地方会有一个主Employee表,这将使您不必为了获取名称列表而执行内联视图。

这似乎很简单。 尝试这个:

select a.employee,b.created,c.modified ....
from (select distinct created_by from data) as a
inner join
     (select created_by,count(*) as created from data group by created_by) as b
on a.employee = b.created_by)

inner join ....

这种效率极低的查询可能是您要寻找的内容的粗略开始。 验证数据后,您可以做一些事情来整理数据并提高效率。

另外,我不认为你需要的DISTINCTUNION部分是因为UNION将返回DISTINCT除非值UNION ALL指定。

SELECT  
    Employees.EmployeeID,
    Created   =(SELECT COUNT(*) FROM Cust_REc WHERE Cust_REc.CreatedBy=Employees.EmployeeID),
    Mopdified =(SELECT COUNT(*) FROM Cust_REc WHERE Cust_REc.LastUser=Employees.EmployeeID AND Cust_REc.CreateBy<>Employees.EmployeeID),
    ModOwn    =
        CASE WHEN NOT Empoyees.IsManager THEN NULL ELSE
            (SELECT COUNT(*) FROM Cust_REc WHERE AcctMan=Employees.EmployeeID)
        END,
    CreatedOwn=(SELECT COUNT(*) FROM Cust_REc WHERE AcctMan=Employees.EmployeeID AND CReatedBy=Employees.EMployeeID)
FROM
    (       
        SELECT
            EmployeeID,
            IsManager=CASE WHEN EXISTS(SELECT AcctMan FROM CustRec WHERE AcctMan=EmployeeID)
        FROM
        (
            SELECT DISTINCT 
                EmployeeID
            FROM
            (
                SELECT EmployeeID=CreatedBy FROM Cust_Rec
                UNION
                SELECT EmployeeID=LastUser FROM Cust_Rec
                UNION
                SELECT EmployeeID=AcctMan FROM Cust_Rec
            )AS Z
        )AS Y
    )
    AS Employees

我对“修改”列有相同的问题。 其他所有列均正常运行。 如果有DCR示例,它可以很好地与employees表上的联接一起使用。

SELECT  CreatedBy AS [Employee],
        COUNT(CreatedBy) AS [Created],
        --Couldn't get modified to pull the right results
        SUM(CASE WHEN LastUser = AcctMan THEN 1 ELSE 0 END) [Mod Own],
        SUM(CASE WHEN CreatedBy = AcctMan THEN 1 ELSE 0 END) [Created Own]
FROM Cust_Rec
GROUP BY CreatedBy

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM