2015-06-22 52 views
1

我有两个表Lossess_tab和numbers_tab。 Losses_tab包含每个item的损失。损失总数将得到一个item的总损失.numbers_tab包含每个item的数字。数字的总和将得到一个item的总数。SQL加入两个BY BYD

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

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

表numbers_tab

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

回答

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

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 

编辑:改变了查询。两个group by,然后inner join按物品ID。

+0

我不想计数..对于数字的总和在numbers_tab –

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

1

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

+0

ITEM_ID我不能接受你正在使用DISTINCT关键字这code..because。如果有一个机会即将到来的两个item_id的数字相同(比如说10)。所以输出将显示10而不是显示20(10 + 10) –

+0

是的,但我使用'Distinct'只是因为你的预期结果,你可以使用这个查询没有不同的,你会预期'SUM'对任何项目。 – Noman

+0

它将无法正常工作...您可以检查 –