【问题标题】:How can I select rows and group duplicate results from 2 tables based on data in a third table?如何根据第三个表中的数据从两个表中选择行并对重复结果进行分组?
【发布时间】:2012-02-16 16:26:38
【问题描述】:

我有 3 个表 (SQL Server 2008 Express):CustomerActivity、EmployeeActivity 和 ShipperActivity


CustomerActivity 有类似这样的数据:

客户名称 OrderNumber ActivityDate ------------ ----------- ------------ ABC 公司 00001 2012-02-15 11:02:15.000 ABC公司 00005 2012-02-15 12:15:01.000 XYZ 公司 00008 2012-02-15 14:02:03.000 XYZ 公司 00008 2012-02-15 14:08:24.000


EmployeeActivity 有类似这样的数据:

EmployeeName OrderNumber ActivityDate ------------ ------------ ------------ 约翰·史密斯 00001 2012-02-15 11:00:39.000 简·多伊 00008 2012-02-15 11:02:15.000 约翰·史密斯 00008 2012-02-15 13:25:01.000 简·多伊 00005 2012-02-15 14:12:13.000 简·多伊 00008 2012-02-15 14:28:34.000


ShipperActivity 有类似这样的数据:

ShipperName OrderNumber ActivityDate ------------ ----------- ------------ 大托运人 00008 2012-02-15 10:03:44.000 小托运 00005 2012-02-15 12:05:22.000 BigShipper 00008 2012-02-15 13:45:34.000 USShipper 00001 2012-02-15 14:11:23.000


考虑到我想检索受 2012 年 2 月 15 日航运活动影响的公司和员工的列表,我应该如何编写 SQL 语句?

期望的输出:

受影响的用户 -------------- ABC公司 简·多伊 约翰·史密斯 XYZ公司

我已经尝试了很多 SQL 语句,但总是失败。

【问题讨论】:

    标签: sql duplicates sql-server-2008-express


    【解决方案1】:
    SELECT ca.CustomerName AS [Affected Users]
        FROM CustomerActivity ca
            INNER JOIN ShipperActivity sa
                ON ca.OrderNumber = sa.OrderNumber
        WHERE sa.ActivityDate >= '2012-02-15 00:00:00'
            AND sa.ActivityDate < '2012-02-16 00:00:00'
    UNION
    SELECT ea.EmployeeName AS [Affected Users]
        FROM EmployeeActivity ea
            INNER JOIN ShipperActivity sa
                ON ea.OrderNumber = sa.OrderNumber
        WHERE sa.ActivityDate >= '2012-02-15 00:00:00'
            AND sa.ActivityDate < '2012-02-16 00:00:00'
    

    【讨论】:

    • 对我来说效果很好,现在看起来简单多了。感谢 Joe 抽出宝贵时间帮助我学习!
    【解决方案2】:

    我会使用 CTE:

    with MainQuery as (
        select EmployeeName as AffectedUsers, ActivityDate from EmployeeActivity
        union
        Select CustomerName as AffectedUsers, ActivityDate from CustomerActivity
    )
    select AffectedUsers 
    from MainQuery
    Where ActivityDate = '2012-02-16 00:00:00' --you can improve this check, its not the goal of the question
    

    【讨论】:

      猜你喜欢
      • 2017-12-29
      • 1970-01-01
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多