繁体   English   中英

SQL检查一行的值是否大于下一行

[英]SQL check if the value of one row is bigger than the next row

我想编写一个SQL查询,该查询在一家商店的库存中搜索,该商店的可口可乐销量比百事可乐多,这是我目前拥有的查询和结果:

SELECT Verkoop.item_id, Verkoop.item_name, Verkoop.shop_name, SUM(Verkoop.sold) as WinkelTot
FROM(
    SELECT tbl_items.item_id, tbl_items.item_name, shop_name, sold
    FROM tbl_stock
    NATURAL JOIN tbl_shops
    NaTURAL JOIN tbl_items
    ORDER BY sold DESC) AS Verkoop
WHERE Verkoop.item_name LIKE "%Coca Cola%" OR Verkoop.item_name LIKE "%Pepsi%"
GROUP BY   
    CASE
        WHEN Verkoop.item_name LIKE "%Coca Cola%" THEN 'Coca Cola'
        WHEN Verkoop.item_name LIKE "%Pepsi%" THEN 'Pepsi'
    END,
    Verkoop.shop_name
ORDER BY shop_name DESC

当前结果:

item_id       i tem_name          shop_name       shop_sold
  41      Pepsi Cola 6X1.5L    TREKK Zaventem       566
  40      Coca Cola  6X0.5L    TREKK Zaventem       1662
  41      Pepsi Cola 6X1.5L    TREKK VLBR2          1292
  40      Coca Cola  6X0.5L    TREKK VLBR2          1478
  39      Coca Cola 6X1.5L     TREKK Landen         630
  41      Pepsi Cola 6X1.5L    TREKK Landen         1402
  42      Pepsi Cola 6X0.5L    TREKK Hola           1672
  40      Coca Cola  6X0.5L    TREKK Hola           862
  42      Pepsi Cola 6X0.5L    TREKk Antwerpen3     874
  40      Coca Cola  6X0.5L    TREKk Antwerpen3     895
  39      Coca Cola 6X1.5L     TREKk Antwerpen2     390
  42      Pepsi Cola 6X0.5L    TREKk Antwerpen2     1230

因此,此查询返回所有百事可乐和可乐文章及其相应的商店和销售。

现在,我想将每一行与他们的百事可乐变体进行比较。

所需结果:

  shop_name         more_cola_than_pepsi
 TREKK Zaventem            yes
 TREKK VLBR3               yes
 TREKK LANDEN              no
 TREKK Hola                no
 TREKK Antwerpen3          yes
 TREKK Antwerpen2          no

有人知道如何解决这个问题吗? 谢谢。

首先, 不要使用NATURAL JOIN 简直是坏了。 它基于具有相同名称的列连接表,因此对这两个表的定义进行少量更改都可能会中断查询。 它甚至会忽略显式外键引用。

其次,您在子查询中使用ORDER BY 这是另一种危险的做法,在这种情况下,完全是多余的。

您想要的查询可以只使用条件聚合:

SELECT sh.shop_name,
       SUM(CASE WHEN i.item_name LIKE '%Coca Cola%' THEN st.sold ELSE 0 END) as Coke,
       SUM(CASE WHEN i.item_name LIKE '%Pepsi%' THEN st.sold ELSE 0 END) as Pepsi,
       (CASE WHEN SUM(CASE WHEN i.item_name LIKE '%Coca Cola%' THEN st.sold ELSE 0 END) > 
                  SUM(CASE WHEN i.item_name LIKE '%Pepsi%' THEN st.sold ELSE 0 END)
             THEN 'yes' ELSE 'no'
        END) as CokeMoreThanPepsi
FROM tbl_stock st JOIN
     tbl_shops sh
     USING (<appropriate columns here>)
     tbl_items i
     USING (<appropriate columns here>)
WHERE i.item_name LIKE '%Coca Cola%' OR i.item_name LIKE '%Pepsi%'
GROUP BY sh.shop_name

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM