【问题标题】:Subtract two subqueries减去两个子查询
【发布时间】:2013-01-02 15:07:46
【问题描述】:

我有以下疑问。我想从 SUM 中减去数字,然后只返回结果不是 0 的数字。任何帮助将不胜感激。我也很想看看这是否可以在一个查询中完成。我用 HAVING 子句尝试了它,但它返回了错误的结果。使用 SQL Server 2008

  SELECT 
(
 SELECT station_id, SUM(tcl_missing + tcl_not_missing) as tcl_total
 FROM tcl_missing_summary 
 GROUP BY station_id
) as a 

(
 SELECT station_id, SUM(total) as total
 FROM tcl_breakdown_op
 WHERE tr_standard not like '%cru'
 GROUP BY station_id
) as b
 WHERE a.tcl_total - total <> 0

【问题讨论】:

    标签: sql sql-server select subquery


    【解决方案1】:

    假设您有多个 stationID,

      SELECT station_id, tcl_total, total, a.tcl_total - total as diff
    from (
     SELECT station_id, SUM(tcl_missing + tcl_not_missing) AS tcl_total
     FROM tcl_missing_summary 
     GROUP BY station_id
    ) AS a INNER JOIN
    
    (
     SELECT station_id, SUM(total) AS total
     FROM tcl_breakdown_op
     WHERE tr_standard NOT LIKE '%cru'
     GROUP BY station_id
    ) AS b
    ON a.stationid = b.stationid
     WHERE a.tcl_total - total <> 0
    

    也可以考虑

    SELECT 
        station_id,
        SUM(tcl_missing + tcl_not_missing) AS sum_tcl_total,
        SUM(total) AS sum_total,
        SUM(tcl_missing + tcl_not_missing) - SUM(total) AS diff
    FROM 
        tcl_missing_summary s INNER JOIN
        tcl_breakdown_op b ON
        s.station_id = b.station_id
    WHERE
         tr_standard NOT LIKE '%cru'    
    GROUP BY 
        station_id
    HAVING
        SUM(tcl_missing + tcl_not_missing) <> SUM(total)
    

    【讨论】:

      【解决方案2】:

      试试这个

      ; WITH CTE1 AS 
      (
      SELECT station_id, SUM(tcl_missing + tcl_not_missing) as tcl_total
       FROM tcl_missing_summary 
       GROUP BY station_id
      ), CTE2 AS
      (
      SELECT station_id, SUM(total) as total
       FROM tcl_breakdown_op
       WHERE tr_standard not like '%cru'
       GROUP BY station_id
      )
      
      SELECT * FROM CTE1 a
      LEFT OUTER JOIN CTE2 b ON a.station_id = b.station_id
      WHERE a.tcl_total - isnull(b.total,0) <> 0
      

      【讨论】:

        【解决方案3】:
        SELECT a.station_id AS station, a.tcl_total-b.total AS difference
        (
         SELECT station_id, SUM(tcl_missing + tcl_not_missing) as tcl_total
         FROM tcl_missing_summary 
         GROUP BY station_id
        ) as a 
        INNER JOIN
        (
         SELECT station_id, SUM(total) as total
         FROM tcl_breakdown_op
         WHERE tr_standard not like '%cru'
         GROUP BY station_id
        ) as b ON a.station_id = b.station_id
         WHERE a.tcl_total - b.total <> 0
        

        如果您知道一个结果集可能没有站点的某些子集的数据,也可以将其转换为外连接。

        【讨论】:

          【解决方案4】:

          我同意 rs 对 CTE 方法的看法,因为嵌套选择恕我直言,在其中两个或三个之后会变得讨厌。 CTE 还一次按一组逻辑地显示您的数据。

          但是,如果您必须使用嵌套选择,只需添加几行即可使其完整:

          SELECT a.tcl_total
          from 
          (
           SELECT station_id, SUM(tcl_missing + tcl_not_missing) as tcl_total
           FROM tcl_missing_summary 
           GROUP BY station_id
          ) as a 
          ,
          (
           SELECT station_id, SUM(total) as total
           FROM tcl_breakdown_op
           WHERE tr_standard not like '%cru'
           GROUP BY station_id
          ) as b
           WHERE a.tcl_total - b.total <> 0
          

          【讨论】:

            猜你喜欢
            • 2019-11-07
            • 2019-11-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多