【问题标题】:SQL Join with Order by and Group bySQL Join 与 Order by 和 Group by
【发布时间】:2014-08-31 11:47:21
【问题描述】:

您好,我正在尝试从另一个 Excel 工作簿加入 Excel。

第一个表中的主键是 Part_No。这不是主键,因此无法进行 1 对 1 连接。

我想从匹配 LIKE 和 NOT LIKE 关键字的结果中选择最佳订单状态。

WHERE 语句完美运行但 FIRST 语句似乎与 ORDER BY 不匹配,结果有些随机。有时我会收到“已取消”的订单,因为有相同零件的订单在库存中。仅先使用 In Stock 执行内部 Select 时,我才看到这两行。

我在 Excel vba 中使用 Provider=Microsoft.ACE.OLEDB.12.0 进行 ADODB 连接。

怎么了?感谢您的帮助!

SELECT 
    FIRST(o.Part_No), 
    FIRST(o.Order_Desc),
    FIRST(o.Order_Status)
FROM 
    Parts 
LEFT JOIN
    (
        SELECT * 
        FROM Orders
        WHERE 
            Orders.Order_Desc Like '%keyword%' AND 
            Orders.Order_Desc Not Like '%otherkeyword%'
        ORDER BY 
            IIF(Orders.Order_Status = 'In Stock' , 1, 
            IIF(Orders.Order_Status = 'In Transit' , 2, 
            IIF(Orders.Order_Status = 'Ordered' , 3, 
            IIF(Orders.Order_Status = 'Canceled' , 4)))) ASC
    ) AS o
    ON Parts.Part_No = o.Part_No
GROUP BY Parts.Part_No;

这是一个例子。

List Parts
Part No
1
2

List Orders
Part No    Order_Desc         Order_Status
1          keyword            In Stock
1          keyword            Canceled
2          keyword            Ordered
2          not keyword        In Stock
2          keyword            Canceled
3          keyword            Ordered
3          keyword            In Stock
3          keyword            In Stock
5          not keyword        In Stock

What i get
1          keyword            Canceled (seems Random right or wrong)
2          keyword            Ordered

Desired Result
1          keyword            In Stock
2          keyword            Ordered

希望这个例子有帮助! 我是在这里发帖的新人。对不起,奇怪的桌子

【问题讨论】:

    标签: sql excel ms-access-2007 vba


    【解决方案1】:

    试试这个:

    SELECT 
    COUNT(o.Part_No), 
    FIRST(o.Part_No), 
    FIRST(o.Order_Status), 
    FIRST(o.Order_No), 
    FIRST(o.Order_Desc),
            IIF(Orders.Order_Status = 'In Stock' , 1, 
            IIF(Orders.Order_Status = 'In Transit' , 2, 
            IIF(Orders.Order_Status = 'Ordered' , 3, 
            4))) AS Order_Status_OrderBy
    
    FROM 
    Parts 
    LEFT JOIN
    (
        SELECT * 
        FROM Orders
        WHERE 
            Orders.Order_Desc Like '%keyword%' AND 
            Orders.Order_Desc Not Like '%otherkeyword%'
        ORDER BY 
            Order_Status_OrderBy
    ) AS o
    ON Parts.Part_No = o.Part_No
    GROUP BY Parts.Part_No;
    

    【讨论】:

    • 这不起作用。我需要在内 Select
    • 将 Order_Status_OrderBy 添加到 GROUP BY
    • 这会在某些结果中产生多行,每个 Order_Status_OrderBy 一个。但仍然以正确的顺序写入行,因此 Order By 有效。只是 FIRST 似乎没有做好它的工作。
    • 我误解了你的问题。也许你可以用一些数据例子来解释,这样我就知道你想要什么了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 2014-01-30
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2020-03-09
    相关资源
    最近更新 更多