【问题标题】:SQL Change output of column if duplicate如果重复,SQL 更改列的输出
【发布时间】:2014-01-02 01:21:24
【问题描述】:

我有一个表格,其中包含客户购买的每种产品的行。我想从 SELECT 查询中输出一列,该列根据客户是否有其他需要交付的物品来显示交付所述物品所需的时间。第一个项目需要 5 分钟才能交付,所有后续项目需要 2 分钟才能交付,例如3 件商品需要 5+2+2=9 分钟才能送达。

这是我目前所拥有的(使用 w3schools 上的 Northwind 示例数据库来测试查询):

SELECT orders.customerid, 
       orders.orderid, 
       orderdetails.productid, 
       CASE((SELECT Count(orders.customerid) 
             FROM   orders 
             GROUP  BY orders.customerid)) 
         WHEN 1 THEN '00:05' 
         ELSE '00:02' 
       END AS DeliveryTime 
FROM   orders 
       LEFT JOIN orderdetails 
              ON orderdetails.orderid = orders.orderid 

由于我的子查询中的 COUNT(我认为?),这将为每个项目输出“00:05”,关于如何解决此问题的任何想法?

【问题讨论】:

    标签: sql count duplicates subquery case


    【解决方案1】:

    试试这个

    SELECT orders.customerid, 
           orders.orderid, 
           orderdetails.productid, 
           numberorders, 
           2 * ( numberorders - 1 ) + 5 AS deleveryMinutes 
    FROM   orders 
           INNER JOIN (SELECT orders.customerid AS countId, 
                              Count(1)          AS numberOrders 
                       FROM   orders 
                       GROUP  BY orders.customerid) t1 
                   ON t1.countid = orders.customerid 
           LEFT JOIN orderdetails 
                  ON orderdetails.orderid = orders.orderid 
    ORDER  BY customerid 
    

    【讨论】:

    • 不幸的是,这为每一行输出相同的数字,而不是为第一行输出 5,为后续行输出 2。我已经玩了一会儿,看看我是否可以让它工作,但我认为问题在于将每个产品放在一个新的行上,所以我认为解决方案将是 Kane 在下面建议的。
    • 抱歉,我一定误解了您登录的目的。我以为你想要所有产品的交货时间。 “例如 3 个项目需要 5+2+2=9 分钟”我很高兴 Kane 的回答对您有用。
    【解决方案2】:

    Gregory 的回答很有效,这是我的尝试

    -- Without each product line item listed
    SELECT  O.CustomerId, 
            O.OrderId, 
            COUNT(*) AS 'NumberOfProductsOrderd',  
            CASE COUNT(*)
                WHEN 1 THEN 5
                ELSE (COUNT(*) * 2) + 3
            END AS 'MinutesToDeliverAllProducts'
    FROM Orders AS O
        INNER JOIN OrderDetails AS D ON D.OrderId = O.OrderId
    GROUP BY O.CustomerId, O.OrderId
    
    -- Without each product line item listed
    SELECT  O.CustomerId, 
            O.OrderId, 
            D.ProductId,
            CASE 
                WHEN P.ProductsInOrder = 1 THEN 5
                ELSE (P.ProductsInOrder * 2) + 3
            END AS 'MinutesToDeliverAllProducts'
    FROM Orders AS O
        INNER JOIN OrderDetails AS D ON D.OrderId = O.OrderId
        INNER JOIN (
            SELECT OrderId, COUNT(*) AS ProductsInOrder
            FROM OrderDetails
            GROUP BY OrderId
        )  AS P ON P.OrderId = O.OrderId
    GROUP BY O.CustomerId, 
            O.OrderId, 
            D.ProductId,
            P.ProductsInOrder
    

    【讨论】:

    • 每个产品都列在单独的行上我仍然遇到同样的问题,但我使用了您的第一个查询并添加了一个 group_concat 来显示每个订单的所有产品 ID,这很棒替代方案,非常感谢!
    【解决方案3】:

    最终代码如下,感兴趣的朋友可以参考:

    SELECT  O.CustomerId, 
            O.OrderId, 
            Group_Concat(D.ProductID) AS ProductID,  
            CASE COUNT(*)
                WHEN 1 THEN 5
                ELSE (COUNT(*) * 2) + 3
            END AS 'MinutesToDeliverAllProducts'
    FROM Orders AS O
        INNER JOIN OrderDetails AS D ON D.OrderId = O.OrderId
    GROUP BY O.CustomerId
    

    【讨论】:

      猜你喜欢
      • 2015-08-18
      • 2017-04-12
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 2016-06-22
      • 2016-08-04
      相关资源
      最近更新 更多