程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了SQL查询通过合并2个表来查找每天售出的书籍总数?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决SQL查询通过合并2个表来查找每天售出的书籍总数??

开发过程中遇到SQL查询通过合并2个表来查找每天售出的书籍总数?的问题如何解决?下面主要结合日常开发的经验,给出你关于SQL查询通过合并2个表来查找每天售出的书籍总数?的解决方法建议,希望对你解决SQL查询通过合并2个表来查找每天售出的书籍总数?有所启发或帮助;

我正在尝试查找每个 product_IDtxn_day 的总销量(数量总和)。我有 2 个表,transactionscatalog 如下:

表 1:transaction

market_ID,txn_day,customer_ID,product_ID,quantity
1,2019-03-01,1,B0002,1
1,2,B0003,B0001,1
3,3,4,1
4,5,6,1

表 2:catalog

market_ID,Title_name
1,Harry Potter 1
1,Harry Potter 2
1,Harry Potter 3
3,Harry Potter 1
3,Harry Potter 2
3,Harry Potter 3
4,Harry Potter 1
4,Harry Potter 2
4,Harry Potter 3

我编写了以下查询并获得了 product_ID 的总销量(数量总和):

SELECT 
    transaction.txn_day,transaction.product_ID,SUM(quantity) AS quantity 
FROM 
    transaction
GROUP BY
    transaction.product_ID,transaction.txn_day;

我尝试通过以下查询为每个 Title_name 获取 product_ID,但似乎不正确。

SELECT 
    transaction.txn_day,catalog.Title_name,SUM(quantity) AS quantity 
FROM 
    catalog
INNER JOIN 
    transaction ON catalog.product_ID = transaction.product_ID
GROUP BY
    transaction.txn_day,catalog.Title_name;

我得到以下结果:

|txn_day    |product_ID |Title_name     |quantity
|2019-03-01 |B0002      |Harry Potter 2 |9
|2019-03-01 |B0001      |Harry Potter 1 |12
|2019-03-01 |B0003      |Harry Potter 3 |3

我希望结果类似于:

|txn_day    | product_ID | quantity | Title_name
|2019-03-01 | B0003      | 1        | Harry Potter 3
|2019-03-01 | B0002      | 3        | Harry Potter 2
|2019-03-01 | B0001      | 4        | Harry Potter 1

请提出查询所需的任何更改。

解决方法

我加载了您的数据并得到了以下结果:

DATE        ID      TITLE           QTY
3/1/2019    B0002   Harry Potter 2  9
3/1/2019    B0003   Harry Potter 3  3
3/1/2019    B0001   Harry Potter 1  12

您在这里的错误提示是,您的每条记录的数量是 3 倍。

如果您查看 INNER JOIN,您只会通过 product_id 加入。

查看您的交易行。

您可以看到每个 product_id 与 3 个不同的 market_id 一起存在,这就是为什么您的数量增加了两倍。

解决办法: 将 market_id 添加到 JOIN:

SELECT   t.txn_day,t.product_id,c.title_name,SUM(quantity) AS quantity
FROM     catalog c
         INNER JOIN transactions t ON c.product_id = t.product_id AND c.market_id = t.market_id
GROUP BY t.txn_day,c.title_name
order by c.title_name;

你会得到你的结果:

3/1/2019    B0001   Harry Potter 1  4
3/1/2019    B0002   Harry Potter 2  3
3/1/2019    B0003   Harry Potter 3  1
,

这是错误的,因为 product_id 和 title_name 在目录中不是唯一的。考虑:

SELECT transaction.txn_day,transaction.product_id,title_name,sum(quantity) as qty FROM (SELECT DISTINCT product_id,title_name FROM catalog) AS cat
INNER JOIN transaction ON cat.product_id=transaction.product_id
group by transaction.txn_day,catalog.title_name;

此外,与本机字段名称相同的字段别名可能会在某些系统中引起问题,而在 Access 中确实如此。

,

我认为你需要加入两列,而不是一列——市场和产品:

SELECT t.txn_day,product_id,SUM(quantity) as quantity
FROM catalog c INNER JOIN
     transaction t
     USING (product_id,market_id)
GROUP BY t.txn_day,c.title_name;

这使用 USING 子句来简化 JOIN 条件。它还引入了表别名,因此查询更易于编写和阅读。

,

您的数据表明,只有 product_id 才是 title_name 的关键。所以:

SELECT t.*,c.title_name
FROM  (
   SELECT txn_day,sum(quantity) AS sum_quantity
   FROM   transaction
   GROUP  BY txn_day,product_id
   ) t
LEFT   JOIN (
   SELECT DISTINCT product_id,title_name
   FROM   catalog
   ) c USING (product_id);

你真的应该有一个表格 product 列出不同的产品。
(除非您的示例数据具有误导性并且只有组合 (market_id,product_id) 是唯一的 - 在这种情况下,在聚合中省略 market_id 是没有意义的。因此我回到我的第一个假设。)

除此之外,我使用子查询 SELECT DISTINCT product_id,title_name FROM catalog 即时派生该表。

LEFT JOIN 而不是 JOIN 是在表 product_id 中找不到 catalog 时防止消除行的保险。

此外,先聚合后加入通常更便宜。见:

  • Query with LEFT JOIN not returning rows for count of 0

大佬总结

以上是大佬教程为你收集整理的SQL查询通过合并2个表来查找每天售出的书籍总数?全部内容,希望文章能够帮你解决SQL查询通过合并2个表来查找每天售出的书籍总数?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: