繁体   English   中英

来自两个表的SQL总和和组值

[英]SQL sum and group values from two tables

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

发票行:

+-----------+----------+-----+----------+
| 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 |
+-----------+----------+-----+----------+

发票头:

+-----------+----------+------------+
| 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'
)

这将起作用,并将对一月份的所有发票的所有行的值(总销售额)求和。

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

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

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

我已经尝试过各种连接,但最终会出现很多重复,而且我不确定如何同时进行SUM和分组。 有谁知道如何做到这一点?

尝试这个

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;

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

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
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

您可以尝试一次:

    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   

暂无
暂无

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

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