【问题标题】:Complicated Order By Clause?复杂的按条款排序?
【发布时间】:2010-03-26 15:06:08
【问题描述】:

我需要做的事情对我来说是一种高级排序。我有这两个表:

表:水果 水果|收到|篮子里 1 20100310 2 2 20091205 3 3 20100220 1 4 20091129 2 表:篮子 编号 |姓名 1 大折扣 2 优质水果 3 标准产品

我什至不确定我是否可以清楚地说明我想如何排序(这可能是我似乎无法编写代码来做它的主要原因,哈哈)。

我进行了一个连接查询,需要进行排序,以便所有内容都按购物篮编号进行组织。具有最早fruit.received 日期的basketid 首先出现,然后是具有相同basketid 的其他行(按日期asc),然后是具有下一个最早fruit.received date 的basketid,然后是具有相同basketid 的其他行,依此类推。

所以输出应该是这样的:

水果 |收到 |篮子 4 20091129 优质水果 1 20100310 优质水果 2 20091205 标准产品 3 20100220 大优惠

任何想法如何在一次执行中完成此任务?

【问题讨论】:

    标签: sql sql-server sql-order-by


    【解决方案1】:

    试试这个(sql server table setup code,但是查询应该在任何数据库中都可以)

    DECLARE @Fruit table (fruitid int, received int, basketid int)
    INSERT @Fruit VALUES(1,       20100310,   2 )
    INSERT @Fruit VALUES(2,       20091205,   3 )
    INSERT @Fruit VALUES(3,       20100220,   1 )
    INSERT @Fruit VALUES(4,       20091129,   2 )
    
    DECLARE @Basket table (id int,basket varchar(20))
    INSERT @Basket VALUES (1,    'Big Discounts'  )
    INSERT @Basket VALUES (2,    'Premium Fruit'  )
    INSERT @Basket VALUES (3,    'Standard Produce')
    
    
    SELECT
        f.Fruitid ,f.received,b.basket  
        FROM @Fruit f
          INNER JOIN (SELECT
                          basketid, MIN(received) AS received
                          FROM @Fruit
                          GROUP BY basketid  
                     ) o ON f.basketid = o.basketid
          INNER JOIN @Basket b ON o.basketid=b.id
        ORDER BY o.received
    

    输出

    Fruitid     received    basket
    ----------- ----------- --------------------
    4           20091129    Premium Fruit
    1           20100310    Premium Fruit
    2           20091205    Standard Produce
    3           20100220    Big Discounts
    
    (4 row(s) affected)
    

    【讨论】:

    • 认为您应该将 ORDER By 更改为 ORDER BY o.received, f.received
    • @sgmoore ,是的,我注意到在@Quassnoi 将其添加到他的查询之后
    【解决方案2】:
    SELECT  f.fruitid, f.received, ba.name AS basket
    FROM    Fruit f
    JOIN    (
            SELECT  basketid, MIN(received) AS mr
            FROM    fruit
            GROUP BY
                    basketid  
            ) b
    ON      f.basketid = b.basketid
    JOIN    basket ba
    ON      ba.id = f.basketid
    ORDER BY
            b.mr, f.basketid, f.received
    

    【讨论】:

    • 这并没有给出 OP 想要的列
    • 没有f.mr要订购的应该是b.mr; FROM Friut应果; ON f.backetid 应该是 f.basketid; ,ba.name 应该是 ba.basket
    猜你喜欢
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2012-11-03
    • 2017-05-27
    • 1970-01-01
    相关资源
    最近更新 更多