选择一列值,对应其他列的不同值

时间:2013-08-23 06:43:37

标签: mysql group-by distinct

voucherId   value  balance
   1         100    20
   2         300    120
   3         500    220

orderId   voucherId  ordertouserId
   1         1           1
   2         3           2   
   3         2           1
   4         1           1  
   2         2           2   

我有两张桌子券和订单。我想

select sum(value)
from vouchers with distinct orderid
group by ordertouserId

我不确定我该怎么做。

此查询:

select o.ordertouserId, count(o.order_id) as Orders, sum(v.value) as Total_value
from vouchers v
join orders o on o.voucher_id = v.voucher_id
group by o.ordertouserId

给出结果:

ordertouserId  Orders Total_value
 1               3      500   
 2               2      1000

但我想选择与sum(v.value)对应的distinct o.orderId作为Total_value

期望的结果:

ordertouserId  Orders Total_value
 1               3      500   
 2               1      500

2 个答案:

答案 0 :(得分:0)

在您想要的输出中,ordertouserId = 2显示了voucherId = 3的Total_value。您是如何确定不想显示voucherId = 2的Total_value的?

对不起,这不是答案,但我没有足够的“声誉”来发表评论。为了更好地理解你如何为ordertouserId = 2选择Total_value = 500(而不是Total_value = 300),我的答案必须是:

您无法获得所需的输出,因为没有明确的方法可以确定在计算Total_value时应使用哪个voucherId,其中ordertouserId = 2。

BTW,我认为第一个输出表中有一个错误,显示ordertouserId = 2且Total_value = 1000. ordertouserId = 2的TotalValue不应该是300 + 500 = 800?

答案 1 :(得分:0)

根据我对其他答案的评论中的建议,我创建了表并运行了查询。这就是我所拥有的(它与你在问题中的输出不同)。顺便说一句,您发布的查询也没有按照提供的方式工作,列名称中有驼峰案例Id和_id的混合。

我创建了表并运行了查询。结果如下:

mysql> select * from vouchers;
    +-----------+-------+---------+
    | voucherId | value | balance |
    +-----------+-------+---------+
    |         1 |   100 |      20 |
    |         2 |   300 |     120 |
    |         3 |   500 |     220 |
    +-----------+-------+---------+
    3 rows in set (0.00 sec)
mysql> select * from orders;
    +---------+-----------+---------------+
    | orderId | voucherId | ordertouserId |
    +---------+-----------+---------------+
    |       1 |         1 |             1 |
    |       2 |         3 |             2 |
    |       3 |         2 |             1 |
    |       4 |         1 |             1 |
    |       2 |         2 |             2 |
    +---------+-----------+---------------+
    5 rows in set (0.00 sec)
mysql> select o.ordertouserId, count(o.orderId) as Orders, sum(v.value) as Total_value from vouchers v join orders o on o.voucherId=v.voucherId group by o.ordertouserId
    +---------------+--------+-------------+
    | ordertouserId | Orders | Total_value |
    +---------------+--------+-------------+
    |             1 |      3 |         500 |
    |             2 |      2 |         800 |
    +---------------+--------+-------------+