【问题标题】:Getting max values from SQL Server join从 SQL Server 连接中获取最大值
【发布时间】:2013-01-06 21:47:52
【问题描述】:

我已经为 SQL Server 查询苦苦挣扎了一段时间,并意识到我必须从比我更了解 SQL Server 的人那里获得帮助。

环境:SQL Server 2008

SELECT      
    t1.SUPPL_ORDERNO, 
    t2.OUR_ORDER,
    t3.CUST_INVOICE
FROM t1 

    LEFT OUTER JOIN t2 
        ON t1.SUPPL_ORDERNO = t2.ORDER_REM5 

    LEFT OUTER JOIN t3
        ON t2.ORDER_REM5  = t3.INV_REM5

GROUP BY t1.SUPPL_ORDERNO, t2.OUR_ORDER, t3.CUST_INVOICE
ORDER BY t1.SUPPL_ORDERNO,t3.CUST_INVOICE

这是我通过上面的查询得到的结果:

SUPPL_ORDERNO                  OUR_ORDER CUST_INVOICE
------------------------------ --------- ------------
143914                         64228     179890
143914                         64228     179935
143914                         64228     179995
143914                         64228     179999
143914                         64228     180067
143914                         64228     180148
326042                                   
326052                         64549     180219
326086                         64633  

我为每个SUPPL_ORDERNOOUR_ORDER 组合获得多个CUST_INVOICE,但我只想返回最新的CUST_INVOICE(=最大的发票号)。

这是我要返回的结果:

SUPPL_ORDERNO                  OUR_ORDER CUST_INVOICE
------------------------------ --------- ------------
143914                         64228     180148
326042                                   
326052                         64549     180219
326086                         64633   

总结:

  1. 如果SUPPL_ORDERNOOUR_ORDER 的组合有不止一 (1) 个CUST_INVOICE,我只想显示数字最大的CUST_INVOICE
  2. 如果没有OUR_ORDERCUST_INVOICE 我希望它显示为空
  3. 如果有 OUR_ORDER 而没有 CUST_INVOICE 我希望它显示为空

任何帮助将不胜感激!

【问题讨论】:

    标签: sql sql-server sql-server-2008 join


    【解决方案1】:

    从 GROUP BY 中删除 t3.CUST_INVOICE 并在 SELECT 语句中使用 MAX(t3.CUST_INVOICE) 函数

    SELECT t1.SUPPL_ORDERNO, t2.OUR_ORDER, MAX(t3.CUST_INVOICE) AS CUST_INVOICE
    FROM t1 LEFT JOIN t2 ON t1.SUPPL_ORDERNO = t2.ORDER_REM5 
            LEFT JOIN t3 ON t2.ORDER_REM5  = t3.INV_REM5
    GROUP BY t1.SUPPL_ORDERNO, t2.OUR_ORDER
    ORDER BY t1.SUPPL_ORDERNO, t3.CUST_INVOICE
    

    SQLFiddle上的简单示例

    【讨论】:

      【解决方案2】:

      解决此问题的最佳方法是使用row_number()。这会为事物添加一个序列号,在本例中是每个订单中的发票号:

      select suppl_orderno, our_order, cust_invoice
      from (SELECT t1.SUPPL_ORDERNO, t2.OUR_ORDER, t3.CUST_INVOICE,
                   row_number() over (partition by t1.SUPPL_ORDERNO, t2.OUR_ORDER order by t3.cust_invoice desc) as seqnum
            FROM t1 LEFT OUTER JOIN
                 t2 
                 ON t1.SUPPL_ORDERNO = t2.ORDER_REM5 LEFT OUTER JOIN
                 t3
                 ON t2.ORDER_REM5  = t3.INV_REM5
           ) t
      where seqnum - 1
      ORDER BY SUPPL_ORDERNO,CUST_INVOICE
      

      通过按降序对发票进行排序,最新的发票将获得值“1”,用于过滤器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-21
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多