SQL查询联接(从不同表创建合并总和的视图)

时间:2018-08-11 14:22:04

标签: mysql sql join subquery

您好,我需要有关此问题的帮助。我想创建一个视图,在其中显示已购买和已售商品的摘要。

这些是我的桌子:

**tblfruit**
 ID       Name
 1        Apple
 2        Orange
 3        mango


 **tblpurchaseditems**
ID      fruit_id        qty   amount
1         1             3      75
2         1             2      50
3         2             1      10
4         3             3      30

**tblsolditems**
ID      fruit_id        qty   amount
1         1             2      150
2         1             2      350
3         2             1      50
4         3             2      230
5         3             1      120

我想要输出:

 **tblsummary**
ID      fruit_id        totalqtypurchased totalamountpurchased  totalqtysold  totalamountsold
1         1                 5                    125                4             500
2         2                 1                    10                 1             50
3         3                 3                    30                 3             350

3 个答案:

答案 0 :(得分:0)

因此,有两种方法可以在线或使用联接来实现。

内联: 选择名称(从表b中选择sum(qty))作为总数 来自tablea

加入: 选择一个名称,sum(b.qty)作为totalqty 从表a 加入tableb b 在b.itemid = a.itemid 按名称分组

对于多个表,由于重复操作,使用连接可能会变得更加棘手,因此对于较小的查询,内联查询可以在此处更好地工作。

答案 1 :(得分:0)

select a.fruit_id,sum(b.qty),sum(b.amount),sum(c.qty),sum(c.amount) 
from tblfruit a,tblpurchaseditems b,tblsolditems c 
where a.fruit_id=b.fruit_id and a.fruit_id=c.fruit_id
group by a.fruit_id

答案 2 :(得分:0)

根据您的样本数据和预期结果

您可以尝试input_pattern合并UNION ALLtblpurchaseditems表,并使tblpurchaseditems成为两个结果集。然后使用 condition聚合函数获得您期望的结果。

grp

查询1

CREATE TABLE tblpurchaseditems(
   ID INT,
   fruit_id INT,
   qty INT,
   amount INT
);

INSERT INTO tblpurchaseditems VALUES (1,1,3,75);
INSERT INTO tblpurchaseditems VALUES (2,1,2,50);
INSERT INTO tblpurchaseditems VALUES (3,2,1,10);
INSERT INTO tblpurchaseditems VALUES (4,3,3,30);

CREATE TABLE tblsolditems(
   ID INT,
   fruit_id INT,
   qty INT,
   amount INT
);


INSERT INTO tblsolditems VALUES (1,1,2,150);
INSERT INTO tblsolditems VALUES (2,1,2,350);
INSERT INTO tblsolditems VALUES (3,2,1,50);
INSERT INTO tblsolditems VALUES (4,3,2,230);
INSERT INTO tblsolditems VALUES (5,3,1,120);

Results

SELECT (@RN:=@RN+1) ID,
       fruit_id, 
       SUM(CASE WHEN grp = 1 THEN  qty END) totalqtypurchased ,
       SUM(CASE WHEN grp = 1 THEN  amount END) totalamountpurchased  ,
       SUM(CASE WHEN grp = 2 THEN  qty END) totalqtysold,
       SUM(CASE WHEN grp = 2 THEN  amount END) totalamountsold
FROM (
  select 1 grp,fruit_id,qty,amount from tblpurchaseditems
  UNION ALL 
  SELECT 2,fruit_id,qty,amount FROM tblpurchaseditems
)t1 CROSS JOIN (SELECT @RN:=0) v
GROUP BY fruit_id

注意

我会在表中使用一列| ID | fruit_id | totalqtypurchased | totalamountpurchased | totalqtysold | totalamountsold | |----|----------|-------------------|----------------------|--------------|-----------------| | 1 | 1 | 5 | 125 | 5 | 125 | | 2 | 2 | 1 | 10 | 1 | 10 | | 3 | 3 | 3 | 30 | 3 | 30 | ,它可以代表哪种类型。

  • itemGroup的意思是1
  • purchaseditems的意思是2

那将不需要使用solditems来合并两个表,更有意义。

因此,表中的架构将如下所示。

UNION ALL

查询1

CREATE TABLE tblitems(
       ID INT,
       fruit_id INT,
       qty INT,
       amount INT,
       itemGroup INT
);


INSERT INTO tblitems VALUES (1,1,3,75,1);
INSERT INTO tblitems VALUES (2,1,2,50,1);
INSERT INTO tblitems VALUES (3,2,1,10,1);
INSERT INTO tblitems VALUES (4,3,3,30,1);



INSERT INTO tblitems VALUES (1,1,2,150,2);
INSERT INTO tblitems VALUES (2,1,2,350,2);
INSERT INTO tblitems VALUES (3,2,1,50 ,2);
INSERT INTO tblitems VALUES (4,3,2,230,2);
INSERT INTO tblitems VALUES (5,3,1,120,2);

Results

SELECT (@RN:=@RN+1) ID,
       fruit_id, 
       SUM(CASE WHEN  itemGroup = 1 THEN  qty END) totalqtypurchased ,
       SUM(CASE WHEN  itemGroup = 1 THEN  amount END) totalamountpurchased  ,
       SUM(CASE WHEN  itemGroup = 2 THEN  qty END) totalqtysold,
       SUM(CASE WHEN  itemGroup = 2 THEN  amount END) totalamountsold
FROM tblitems t1 CROSS JOIN (SELECT @RN:=0) v
GROUP BY fruit_id