【问题标题】:SQL sum and group values from two tables来自两个表的 SQL 求和和分组值
【发布时间】:2016-02-03 12:46:00
【问题描述】:

我正在尝试根据卖家姓名对销售数据进行分组。该名称在另一个表中可用。我的表格如下所示:

InvoiceRow:

+-----------+----------+-----+----------+
| InvoiceNr | Title    | Row |  Amount  |
+-----------+----------+-----+----------+
|  1        | Chair    |  1  |  2000.00 |
|  2        | Sofa     |  1  |  1500.00 |
|  2        | Cushion  |  2  |  2000.00 |
|  3        | Lamp     |  1  |  6500.00 |
|  4        | Table    |  1  |  -500.00 |
+-----------+----------+-----+----------+

InvoiceHead:

+-----------+----------+------------+
| InvoiceNr | Seller   | Date       |
+-----------+----------+------------+
|  1        | Adam     | 2016-01-01 |
|  2        | Lisa     | 2016-01-04 |
|  3        | Adam     | 2016-01-08 |
|  4        | Carl     | 2016-01-17 |
+-----------+----------+------------+

我目前使用的查询如下所示:

SELECT SUM(Amount)
FROM InvoiceRow
WHERE InvoiceNr IN (
  SELECT InvoiceNr
  FROM InvoiceHead
  WHERE Date >= '2016-01-01' AND Date < '2016-02-01'
)

这有效,并将在 1 月份汇总所有发票(总销售额)的所有行的值。

我要做的是按每个卖家姓名分组的销售摘要。像这样的:

+----------+------------+
| Seller   | Amount     |
+----------+------------+
| Adam     | 8500.00    |
| Lisa     | 3500.00    |
| Carl     | -500.00    |
+----------+------------+

在那之后甚至可能按月分组(但这不是这个问题的一部分,如果我解决了这个问题,我希望能够弄清楚)。

我尝试了各种联接,但最终得到了很多重复项,而且我不确定如何同时求和和分组。有谁知道怎么做?

【问题讨论】:

  • 这是一个非常基本的joingroup by 查询。
  • 您应该尝试在 InvoiceNr 字段上加入 - 另外,在您的 WHERE InvoiceNr 中,也选择卖方字段,然后 Group By

标签: sql


【解决方案1】:

试试这个

SELECT seller, SUM(amount) FROM InvoiceRow 
JOIN InvoiceHead 
ON InvoiceRow.InvoiceNr = InvoiceHead.InvoiceNr
GROUP BY InvoiceHead.seller;

或者如果你想在两个日期之间。试试这个

SELECT seller, SUM(amount) FROM InvoiceRow 
JOIN InvoiceHead 
ON InvoiceRow.InvoiceNr = InvoiceHead.InvoiceNr
WHERE InvoiceHead.Date >= '2016-01-01' AND InvoiceHead.Date < '2016-02-01'
GROUP BY InvoiceHead.seller;

【讨论】:

  • 哇,不到 5 分钟就有 3 条回复。我遵循了你的,因为它接近我的语法。我遇到的一个问题是加入后的总金额与之前不同。出了点问题,我感觉连接创建了重复项,这些重复项沿其他行求和,从而增加了数量。 IE。如果我使用原始查询并将 SUM 值与加入和分组后得到的值进行比较,它们不匹配。我的意思是每个卖家的金额不等于我加入和分组之前获得的金额。
【解决方案2】:

您只需要加入表格,根据需要按日期过滤结果,然后进行分组:

select
   H.Seller,
   sum(R.Amount) as Amount
from InvoiceHead as H
    left outer join InvoiceRow as R on R.InvoiceNr = H.InvoiceNr
where H. Date >= '2016-01-01' AND H.Date < '2016-02-01' 
group by H.Seller

【讨论】:

    【解决方案3】:
    SELECT t.seller,sum(s.amount)
    FROM invoiceRow s join InvoiceHead t
    ON s.invoiceNr = t.invoiceNr 
    group by t.seller
    

    你应该总结一下。如果需要日期范围,您可以在 ON 子句之后添加一个 where 子句并像这样过滤您的日期:

    SELECT t.seller,sum(s.amount)
    FROM invoiceRow s join InvoiceHead t
    ON s.invoiceNr = t.invoiceNr 
    WHERE t.date between '01-01-2016' and '31-01-2016' 
    group by t.seller
    

    【讨论】:

      【解决方案4】:

      您可以尝试一次:

          SELECT ih.Seller,   
           (
              SELECT SUM(Amount) FROM invoicerow ir
              INNER JOIN invoicehead ih1
                  ON (ir.InvoiceNr = ih1.InvoiceNr)
                  WHERE ih1.Seller = ih.Seller
              ) AS Amount 
          FROM invoicehead ih 
          GROUP BY  ih.Seller   
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-11
        • 2021-05-19
        • 1970-01-01
        • 1970-01-01
        • 2013-04-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多