【问题标题】:SQL joining queries from two databases来自两个数据库的 SQL 连接查询
【发布时间】:2014-02-26 23:47:23
【问题描述】:

我有来自两个不同表的查询,它们按 yyyy-mm 对各自的数据(计数)进行分组。我想从两个查询中获取计数结果并将它们一起显示。以下是我的两个查询:

问题 1:

    DECLARE @ThisMonth DATETIME
    SET @ThisMonth = DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000101')

    select cast(cast(TransportAppv6.dbo.T_FatigueNCRs.date as date) as varchar(7)) AS     [MONTH], COUNT(TransportAppv6.dbo.T_FatigueNCRDetails.NCRID) AS [NCRs]
    FROM TransportAppv6.dbo.T_FatigueNCRs 
    LEFT OUTER JOIN TransportAppv6.dbo.T_FatigueNCRDetails 
    ON T_FatigueNCRs.NCRID = TransportAppv6.dbo.T_FatigueNCRDetails.NCRID 
    LEFT OUTER JOIN TransportAppv6.dbo.T_Driver 
    ON TransportAppv6.dbo.T_FatigueNCRs.DriverID = TransportAppv6.dbo.T_Driver.ID
    WHERE (TransportAppv6.dbo.T_FatigueNCRDetails.CancelYN = 0) 
    AND (TransportAppv6.dbo.T_Driver.FleetID = 2) 
    AND  (TransportAppv6.dbo.T_Driver.Active = 1) 
    AND (TransportAppv6.dbo.T_FatigueNCRDetails.NCRTypeID = 1) 
    AND (TransportAppv6.dbo.T_FatigueNCRDetails.Details <> 'Driving Hours Breach As Per Breach Report') 
    AND (TransportAppv6.dbo.T_FatigueNCRs.Date >= DATEADD(MONTH, -6, @ThisMonth)   
    AND TransportAppv6.dbo.T_FatigueNCRs.Date <  @ThisMonth)
    GROUP BY cast(cast(TransportAppv6.dbo.T_FatigueNCRs.date as date) as varchar(7))

返回:

MONTH     NCRs
2013-08   43
2013-09   34
2013-10   53

问题 2:

    DECLARE @ThisMonth DATETIME
    SET @ThisMonth = DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000101')

    select cast(cast(landing.dbo.landing_runs.date as date) as varchar(7)) as [MONTH], COUNT(*) as [RUNS]
    from landing.dbo.Landing_Runs
    where (landing.dbo.Landing_Runs.date >= DATEADD(MONTH, -6, @ThisMonth)   
    AND landing.dbo.Landing_Runs.date <  @ThisMonth)
    GROUP BY cast(cast(landing.dbo.landing_runs.date as date) as varchar(7))

返回:

MONTH     RUNS
2013-08   4626
2013-09   4042
2013-10   4481

我想做的是以某种方式加入这两个单独的查询,以便结果显示为:

MONTH     RUNS     NCRs
2013-08   4626     43
2013-09   4042     34
2013-10   4481     53

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您可以将它们作为子查询连接在一起。我在下面选择了INNER JOIN,但可以随意将其更改为其他类型的联接。

    DECLARE @ThisMonth DATETIME
    SET @ThisMonth = DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000101')
    
    select t1.[MONTH], t1.[NCRs], t2.[RUNS]
    from
    (
        select cast(cast(TransportAppv6.dbo.T_FatigueNCRs.date as date) as varchar(7)) AS     [MONTH], COUNT(TransportAppv6.dbo.T_FatigueNCRDetails.NCRID) AS [NCRs]
        FROM TransportAppv6.dbo.T_FatigueNCRs 
        LEFT OUTER JOIN TransportAppv6.dbo.T_FatigueNCRDetails 
        ON T_FatigueNCRs.NCRID = TransportAppv6.dbo.T_FatigueNCRDetails.NCRID 
        LEFT OUTER JOIN TransportAppv6.dbo.T_Driver 
        ON TransportAppv6.dbo.T_FatigueNCRs.DriverID = TransportAppv6.dbo.T_Driver.ID
        WHERE (TransportAppv6.dbo.T_FatigueNCRDetails.CancelYN = 0) 
        AND (TransportAppv6.dbo.T_Driver.FleetID = 2) 
        AND  (TransportAppv6.dbo.T_Driver.Active = 1) 
        AND (TransportAppv6.dbo.T_FatigueNCRDetails.NCRTypeID = 1) 
        AND (TransportAppv6.dbo.T_FatigueNCRDetails.Details <> 'Driving Hours Breach As Per Breach Report') 
        AND (TransportAppv6.dbo.T_FatigueNCRs.Date >= DATEADD(MONTH, -6, @ThisMonth)   
        AND TransportAppv6.dbo.T_FatigueNCRs.Date <  @ThisMonth)
        GROUP BY cast(cast(TransportAppv6.dbo.T_FatigueNCRs.date as date) as varchar(7))
    ) t1
    inner join
    (
        select cast(cast(landing.dbo.landing_runs.date as date) as varchar(7)) as [MONTH], COUNT(*) as [RUNS]
        from landing.dbo.Landing_Runs
        where (landing.dbo.Landing_Runs.date >= DATEADD(MONTH, -6, @ThisMonth)   
        AND landing.dbo.Landing_Runs.date <  @ThisMonth)
        GROUP BY cast(cast(landing.dbo.landing_runs.date as date) as varchar(7))
    ) t2 on t1.[MONTH] = t2.[MONTH]
    

    【讨论】:

    • 这正是我需要做的......谢谢。完美运行。
    【解决方案2】:

    如果两个查询都返回相同的月份范围,您可以使用内部连接将它们连接在一起。否则,我将创建一个包含您要显示的所有月份的表变量。让我知道是否可以帮助您。

     DECLARE @ThisMonth DATETIME
        SET @ThisMonth = DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000101')
    
    select ncrs.[Month],ncrs.NCRs,runs.Runs
    from    (
            select
                cast(cast(ncr.date as date) as varchar(7)) AS [MONTH],
                COUNT(ncrd.NCRID) AS [NCRs]
            FROM TransportAppv6.dbo.T_FatigueNCRs ncr 
                LEFT OUTER JOIN TransportAppv6.dbo.T_FatigueNCRDetails 
                    ON T_FatigueNCRs.NCRID = ncrd.NCRID 
                LEFT OUTER JOIN TransportAppv6.dbo.T_Driver 
                    ON ncr.DriverID = TransportAppv6.dbo.T_Driver.ID
            WHERE (ncrd.CancelYN = 0) 
                AND (TransportAppv6.dbo.T_Driver.FleetID = 2) 
                AND  (TransportAppv6.dbo.T_Driver.Active = 1) 
                AND (ncrd.NCRTypeID = 1) 
                AND (ncrd.Details <> 'Driving Hours Breach As Per Breach Report') 
                AND (ncr.Date >= DATEADD(MONTH, -6, @ThisMonth)   
                AND ncr.Date <  @ThisMonth)
            GROUP BY cast(cast(ncr.date as date) as varchar(7))
            ) ncrs
        inner join  (
                    select
                        cast(cast(landing.dbo.landing_runs.date as date) as varchar(7)) as [MONTH],
                        COUNT(*) as [RUNS]
                    from landing.dbo.Landing_Runs
                    where (landing.dbo.Landing_Runs.date >= DATEADD(MONTH, -6, @ThisMonth)   
                        AND landing.dbo.Landing_Runs.date <  @ThisMonth)
                    GROUP BY cast(cast(landing.dbo.landing_runs.date as date) as varchar(7))
                    ) runs
            on runs.[Month] = ncrs.NCRs
    

    【讨论】:

      【解决方案3】:

      您可以通过联合来连接 2 个查询,使用您指定是 NCR 还是 RUNS 的列来区分这两个查询,然后在顶层使用 case 语句进行聚合,按月份分组。见下文:

      DECLARE @ThisMonth DATETIME
      SET @ThisMonth = DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000101')
      
      select [   MONTH ],
             sum(case
               when aggtype = 'NCR' then
                [ NCRs ]
               else
                0
             end as ncrs, sum(case
               when aggtype = 'RUNS' then
                [ RUNS ]
               else
                0
             end as runs from (select 'NCR' as aggtype,
                                cast(cast(TransportAppv6.dbo.T_FatigueNCRs.date as date) as
                                     varchar(7)) AS [ MONTH ],
                                COUNT(TransportAppv6.dbo.T_FatigueNCRDetails.NCRID) AS [ NCRs ]
                           FROM TransportAppv6.dbo.T_FatigueNCRs
                           LEFT OUTER JOIN TransportAppv6.dbo.T_FatigueNCRDetails
                             ON T_FatigueNCRs.NCRID =
                                TransportAppv6.dbo.T_FatigueNCRDetails.NCRID
                           LEFT OUTER JOIN TransportAppv6.dbo.T_Driver
                             ON TransportAppv6.dbo.T_FatigueNCRs.DriverID =
                                TransportAppv6.dbo.T_Driver.ID
                          WHERE (TransportAppv6.dbo.T_FatigueNCRDetails.CancelYN = 0)
                            AND (TransportAppv6.dbo.T_Driver.FleetID = 2)
                            AND (TransportAppv6.dbo.T_Driver.Active = 1)
                            AND (TransportAppv6.dbo.T_FatigueNCRDetails.NCRTypeID = 1)
                            AND (TransportAppv6.dbo.T_FatigueNCRDetails.Details <>
                                'Driving Hours Breach As Per Breach Report')
                            AND (TransportAppv6.dbo.T_FatigueNCRs.Date >=
                                DATEADD(MONTH, -6, @ThisMonth) AND
                                TransportAppv6.dbo.T_FatigueNCRs.Date <
                                @ThisMonth)
                          GROUP BY cast(cast(TransportAppv6.dbo.T_FatigueNCRs.date as date) as
                                        varchar(7))
                         union all
                         select 'RUNS' as aggtype,
                                cast(cast(landing.dbo.landing_runs.date as date) as
                                     varchar(7)) as [ MONTH ],
                                COUNT(*) as [ RUNS ]
                           from landing.dbo.Landing_Runs
                          where (landing.dbo.Landing_Runs.date >=
                                DATEADD(MONTH, -6, @ThisMonth) AND
                                landing.dbo.Landing_Runs.date < @ThisMonth)
                          GROUP BY cast(cast(landing.dbo.landing_runs.date as date) as
                                        varchar(7))) group by [ MONTH ]
      

      【讨论】:

        猜你喜欢
        • 2015-07-31
        • 2018-02-05
        • 2018-04-27
        • 1970-01-01
        • 2021-01-12
        • 1970-01-01
        • 2015-11-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多