【问题标题】:SQL Count between two tables两个表之间的 SQL 计数
【发布时间】:2015-01-18 20:01:10
【问题描述】:

我目前在 SQL Server 中有两个单独的查询,用于计算一个表在一周内包含唯一 ID 的次数。我想使用一个查询来显示这些,而不是两个。

此数据保存在两个单独的视图中,因此我编写了两个查询。它们是ActivityPointerAsp_dealercallreport

查询 #1:

SELECT 
    OwnerIDName, 
    COUNT(Distinct ActivityID) AS CalendarEvents
FROM 
    ActivityPointer
WHERE
    /*Specify Activity code for Calendar Events*/
    ActivityTypeCode = '4201'
    /*Specify Calendar Events from this week only*/
    AND ScheduledStart >= DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) / 7 * 7, 0)
    AND ScheduledStart <= DATEADD(DAY, DATEDIFF(DAY, -1, GETDATE()), 0)
    /*Specify users to be reported on by Name*/
    AND OwnerIdName IN ('John Doe', 'Jane Doe')
GROUP BY 
    OwnerIDName    

查询 #2:

SELECT 
    OwnerIDName, 
    COUNT(Distinct Asp_dealercallreportId) AS DealerVisits
FROM 
    Asp_dealercallreport
    /*Specify Calendar Events from this week only*/
WHERE    
    asp_callreportdate >= DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) / 7 * 7, 0)
    AND asp_callreportdate <= DATEADD(DAY, DATEDIFF(DAY, -1, GETDATE()), 0)
    /*Specify  to be reported on by Name*/
    AND OwnerIdName IN ('John Doe', 'Jane Doe')
GROUP BY 
    OwnerIDName

谢谢

【问题讨论】:

  • 通常,你可以使用一些系统表,它只包含一行或创建一个临时的,然后将两个查询作为子查询来解决,这样你就会有一行,两个字段相同的查询。

标签: sql sql-server join count


【解决方案1】:

也许您可以简单地使用 INNER JOIN 运算符?像这样:

SELECT 
    ap.OwnerIDName, 
    COUNT(Distinct ap.ActivityID) AS CalendarEvents, 
    COUNT(Distinct a_dcr.Asp_dealercallreportId) AS DealerVisits
FROM 
    ActivityPointer ap
INNER JOIN 
    Asp_dealercallreport a_dcr ON ap.OwnerIDName=a_dcr.OwnerIDName
WHERE
/*Specify Activity code for Calendar Events*/
    ap.ActivityTypeCode = '4201'
/*Specify Calendar Events from this week only*/
    AND ap.ScheduledStart >= DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) / 7 * 7, 0)
    AND ap.ScheduledStart <= DATEADD(DAY, DATEDIFF(DAY, -1, GETDATE()), 0)
/*Specify Calendar Events from this week only*/
    AND a_dcr.asp_callreportdate >= DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) / 7 * 7, 0)
    AND a_dcr.asp_callreportdate <= DATEADD(DAY, DATEDIFF(DAY, -1, GETDATE()), 0)
/*Specify users to be reported on by Name*/
    AND ap.OwnerIdName IN ('John Doe', 'Jane Doe')
GROUP BY 
    ap.OwnerIDName    

【讨论】:

  • 巫术。谢谢你。我需要复习一下我的 JOIN。当我这样做时,我想出了一些奇怪的结果。
【解决方案2】:

使用条件聚合:

SELECT OwnerIDName,
       COUNT(Distinct case when ScheduledStart >= DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) / 7 * 7, 0) AND
                                ScheduledStart <= DATEADD(DAY, DATEDIFF(DAY, -1, GETDATE()), 0)
                           then ActivityID end) AS CalendarEvents_Scheduled,
       COUNT(Distinct case when asp_callreportdate >= DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) / 7 * 7, 0) and
                                asp_callreportdate <= DATEADD(DAY, DATEDIFF(DAY, -1, GETDATE()), 0)
                           then ActivityID end) AS CalendarEvents_asp
FROM ActivityPointer
WHERE ActivityTypeCode = '4201' AND
      OwnerIdName IN ('John Doe', 'Jane Doe')
GROUP BY OwnerIDName;

【讨论】:

  • 你没有错过问题中实际上使用了两个表的点吗?
【解决方案3】:

使用标准 SQL UNION 将在一个结果集中为您提供两个查询的输出。只要它们具有相同数量和类型的列:

http://www.w3schools.com/sql/sql_union.asp

SELECT OwnerIDName, COUNT(Distinct ActivityID) AS CalendarEvents
FROM ActivityPointer
WHERE
/*Specify Activity code for Calendar Events*/
    ActivityTypeCode = '4201'
/*Specify Calendar Events from this week only*/
AND ScheduledStart >= DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) / 7 * 7, 0)
AND ScheduledStart <= DATEADD(DAY, DATEDIFF(DAY, -1, GETDATE()), 0)
/*Specify users to be reported on by Name*/
AND OwnerIdName IN ('John Doe', 'Jane Doe')
GROUP BY OwnerIDName    
UNION
SELECT OwnerIDName, COUNT(Distinct Asp_dealercallreportId) AS DealerVisits
FROM Asp_dealercallreport
/*Specify Calendar Events from this week only*/
WHERE    asp_callreportdate >= DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) / 7  * 7, 0)
AND    asp_callreportdate <= DATEADD(DAY, DATEDIFF(DAY, -1, GETDATE()), 0)
/*Specify  to be reported on by Name*/
AND    OwnerIdName IN ('John Doe', 'Jane Doe')
GROUP BY OwnerIDName

【讨论】:

    猜你喜欢
    • 2021-07-20
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 2021-02-24
    • 1970-01-01
    相关资源
    最近更新 更多