【问题标题】:I want to be able to compare revenue for products from two different dates我希望能够比较两个不同日期的产品收入
【发布时间】:2022-11-19 12:43:23
【问题描述】:

所以我可以像这样运行两个单独的查询:

SELECT date as date1, product as product1, product_id as product_id_1, SUM(revenue) AS rev1 
FROM product_inventory 
WHERE date = '2021-11-17' 
GROUP BY date1 , product1, product_id_1 
ORDER BY rev1 DESC
SELECT date as date2, product as product2, product_id as product_id_2, SUM(revenue) AS rev2 
FROM product_inventory 
WHERE date = '2022-11-17' 
GROUP BY date2 , product2, product_id_2 
ORDER BY rev2 DESC

这是我为每个人得到的输出:

date1 product1 product_id_1 rev1
2021-11-17 adidas samba 9724 6087.7000732421875
2021-11-17 nike air max 5361 4918.0
2021-11-17 puma suede 1985 3628.1600341796875
date2 product2 product_id_2 rev2
2022-11-17 adidas samba 9724 5829.0
2022-11-17 nike air max 5361 4841.864013671875
2022-11-17 puma suede 1985 5404.4140625

我怎样才能以一种将 date2 和 rev2 列拉成这样的单个输出的方式查询数据库?

date1 product1 product_id_1 rev1 date2 rev2
2021-11-17 adidas samba 9724 6087.7000732421875 2022-11-17 5829.0
2021-11-17 nike air max 5361 4918.0 2022-11-17 4841.864013671875
2021-11-17 puma suede 1985 3628.1600341796875 2022-11-17 5404.4140625

我试过这个查询:

SELECT A.date1, A.product1, A.rev1, B.date2, B.product2, B.rev2 FROM
(
SELECT date as date1, product as product1, product_id as product_id_1, SUM(revenue) AS rev1 FROM product_inventory WHERE date = '2021-11-17' GROUP BY date1 , product1, product_id_1 ORDER BY rev1 DESC
) A,
(
SELECT date as date2, product as product2, product_id as product_id_2, SUM(revenue) AS rev2 FROM product_inventory WHERE date = '2022-11-17' GROUP BY date2, product2, product_id_2 ORDER BY rev2 DESC
) B;

但我得到了这个输出

date1 product1 rev1 date2 product2 rev2
2021-11-17 puma suede 3628.1600341796875 2022-11-17 adidas samba shoes 5829.0
2021-11-17 nike air max 4918.0 2022-11-17 adidas samba shoes 5829.0
2021-11-17 adidas samba 6087.7000732421875 2022-11-17 adidas samba shoes 5829.0
2021-11-17 puma suede 3628.1600341796875 2022-11-17 puma suede 5404.4140625
2021-11-17 nike air max 4918.0 2022-11-17 puma suede 5404.4140625
2021-11-17 adidas samba 6087.7000732421875 2022-11-17 puma suede 5404.4140625
2021-11-17 puma suede 3628.1600341796875 2022-11-17 nike air max 4841.864013671875
2021-11-17 nike air max 4918.0 2022-11-17 nike air max 4841.864013671875
2021-11-17 adidas samba 6087.7000732421875 2022-11-17 nike air max 4841.864013671875

这就像记录数的平方。

【问题讨论】:

  • 是的,from tablea, tableb 检查 tablea 和 tableb 行的所有可能组合,而不是您想要的。 select version(); 显示什么?

标签: mysql sql database


【解决方案1】:

您需要像这样在 product_id 上使用 JOIN:

WITH DATE_1 AS (
SELECT date as date1, product as product1, product_id as product_id_1, SUM(revenue) AS rev1 
  FROM product_inventory 
 WHERE date = '2021-10-17' 
 GROUP BY 1, 2, 3
),
DATE_2 AS (
SELECT date as date2, product as product2, product_id as product_id_2, SUM(revenue) AS rev2 
  FROM product_inventory 
 WHERE date = '2021-11-17' 
 GROUP BY 1, 2, 3
)
SELECT D1.*, D2.*
  FROM DATE_1 D1
       INNER JOIN DATE_2 D2
          ON D1.product_id_1 = D2.product_id_2

【讨论】:

    【解决方案2】:

    您正在获得表 A 和 B 的笛卡尔连接,即所有行的组合来自一个,因此您会看到记录增加到 9 行,因为 3 x 3。

    你需要做的是做一个表的连接一个关于产品:例如左连接:

    SELECT A.*, B.*
    FROM A
    LEFT JOIN B on A.product = B.product
    

    尽可能避免在 SELECT 中使用 *。

    【讨论】:

      【解决方案3】:

      你需要加入两个结果集。像这样:

      SELECT t1.date, t1.product, t1.product_id, t2.date, t2.product_id, ...
      FROM
        (SELECT ... FROM product_inventory ...) AS t1
      JOIN
        (SELECT ... FROM product_inventory ...) AS t2
      ON t1.product_id = t2.product_id AND t1.date = t2.date
      

      此外,MySQL 8 引入了一个名为 Common Table Expressions (CTE) 的功能,它可能是上述查询的一个很好的替代方案,因为它允许您将要连接的两个结果集的 SELECT 查询分开。所以使用 CTE 你可以这样写:

      WITH 
        t1 AS
        (SELECT ... FROM product_inventory ...),
        t2 AS
        (SELECT ... FROM product_inventory ...),
      SELECT t1.date, t1.product, t1.product_id, t2.date, t2.product_id, ...
      FROM t1      
      JOIN t2 ON t1.product_id = t2.product_id AND t1.date = t2.date
      

      【讨论】:

        猜你喜欢
        • 2015-07-11
        • 1970-01-01
        • 2020-02-06
        • 1970-01-01
        • 1970-01-01
        • 2017-10-23
        • 2019-10-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多