SQL加入两个BY BY总和

时间:2015-06-22 10:26:33

标签: php mysql sql codeigniter

我有两个表Lossess_tab和numbers_tab。 Losses_tab包含每个项目的损失。损失将导致一个项目的总损失.numbers_tab包含每个项目的数字。数字的数字将获得项目的总数。

CREATE TABLE IF NOT EXISTS `losses_tab` (`id` bigint(20) unsigned NOT NULL,`item_id` varchar(50) NOT NULL,`loss` varchar(120) NOT NULL);


INSERT INTO `losses_tab` (`id`, `item_id`, `loss`) VALUES (1,100,1.5),(2,100,1.8),(3,102,1.0),(4,103,1.0),(5,101,0),(6,102,1);

CREATE TABLE IF NOT EXISTS `numbers_tab` (
  `item_id` varchar(50) NOT NULL,
  `number` varchar(120) NOT NULL);
  INSERT INTO `numbers_tab` ( `item_id`, `number`) VALUES
    (100,10),(100,12),(102,1),(103,25),(101,16),(103,9),(102,8);

我希望结果为

------------------------------------------------
| item_id  | total loss   | total number  |
------------------------------------------------
| 100      | 3.3          | 22            |
------------------------------------------------
| 101      | 0            | 16            |
------------------------------------------------
| 102      | 2.0          | 9             |
------------------------------------------------
| 103      | 1.0          | 34            |
------------------------------------------------

这里是我的小提琴链接Link to view the fiddle

TABLE loss_tab

 id item_id loss
    1   100     1.5
    2   100     1.8
    3   102     1.0
    4   103     1.0
    5   101     0
    6   102     1

TABLE numbers_tab

item_id number
100    10
100    12
102    1
103    25
101    16
103    9
102    8

4 个答案:

答案 0 :(得分:1)

尝试

select item_id, sum(loss) as total_loss,
(select sum(number) from numbers_tab nt where nt.item_id = losses_tab.item_id) as total_number
from losses_tab group by item_id

Fiddle

答案 1 :(得分:1)

USE DISTINCT(SUM())JOINGROUP_BY比子查询快得多。

SELECT 
    l.item_id,sum(distinct(l.loss)) 'total_loss',sum(distinct(n.number)) 'total_number'
FROM
   losses_tab l
INNER JOIN numbers_tab n 
ON n.item_id = l.item_id
group by l.item_id,n.item_id   
order by l.item_id

See Online SQL Fiddle

答案 2 :(得分:0)

SELECT * FROM 
  (SELECT item_id, sum(loss) total_loss FROM losses_tab GROUP BY item_id) losses_tab
INNER JOIN 
  (SELECT item_id, sum(number) total_number FROM numbers_tab GROUP BY item_id) numbers_tab 
ON losses_tab.item_id = numbers_tab.item_id

编辑:更改了查询。项目ID为group by,然后是inner join

答案 3 :(得分:0)

您正在寻找的是一个内部联接,其中添加了一些简单的聚合函数:

select
    nu.item_id,
    sum(tb.loss) as 'Total Loss',
    sum(nu.loss) as 'Total Number'
from
    numbers nu
        join losses_tab tb
            on nu.item_id=tb.item_id
group by
    nu.item_id

你可以在一段很长的Q& A中获得关于这些类型的查询的更多信息,我在一段时间之前写了这些问题,以帮助解释这类问题。

How can an SQL query return data from multiple tables