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

来自两个表的SQL总和和组值,sql,Sql,我正试图根据卖家的名字对销售数据进行分组。该名称在另一个表中可用。我的桌子是这样的: 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 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
发票行:

+-----------+----------+-----+----------+
| 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    |
+----------+------------+
发票抬头:

+-----------+----------+-----+----------+
| 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    |
+----------+------------+
我当前处理的查询如下所示:

+-----------+----------+-----+----------+
| 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    |
+----------+------------+
在那之后,甚至可能按月份分组(但这不是这个问题的一部分,我希望如果我解决了这个问题,我能找出答案)

我尝试过各种类型的联接,但是我最终得到了很多重复的联接,我不知道如何同时求和和和分组。有人知道怎么做吗?

试试这个

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;
从发票行中选择卖方金额
连接发票头
在InvoiceRow.InvoiceNr=InvoiceHead.InvoiceNr上
其中发票抬头日期>='2016-01-01'和发票抬头日期<'2016-02-01'
按发票头、卖方分组;

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

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
选择
H.卖方,
金额(R.金额)作为金额
从发票抬头为H
左外部联接发票行作为R在R.InvoiceNr=H.InvoiceNr上的R
其中H.日期>='2016-01-01'和H.日期<'2016-02-01'
H.卖方集团
你应该总结一下。如果需要日期范围,可以在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   

这是一个非常基本的
join
查询
groupby
查询。您应该尝试在
InvoiceNr
字段中加入-另外,在WHERE InvoiceNr中,也选择Seller字段,然后
groupby
Wow,5分钟内回复3次。我遵循了你的语法,因为它接近于我的语法。我遇到的一个问题是,加入后的总金额与加入前有所不同。有点不对劲,我感觉连接创建了重复项,这些重复项沿着其他行求和,从而增加了数量。也就是说,如果我使用原始查询并将总和值与联接和组后得到的值进行比较,则它们不匹配。我想说的是,每个卖家的数量并不等于我加入和分组之前得到的数量。