不同列

时间:2017-09-20 12:21:06

标签: mysql group-by

我有一张桌子:发票

inv_id    cus_id    due_amt    paid      total_due
1         71        300         0        300
2         71        200         0        500
3         71        NULL        125      375
4         72        50          0        50
5         72        150         0        200

我想要结果

cus_id   total_due
71       375  
72       200

我想要total_due unique的{​​{1}}或其他可以说我需要customer的{​​{1}}个详细信息。

我尝试了什么:

latest invoice

但这并没有给出所需的结果。

请有人帮助我..

5 个答案:

答案 0 :(得分:4)

尝试此查询:

SELECT `cus_id` as CustId, (SELECT `total_due` FROM invoice WHERE cus_id = CustId ORDER BY `inv_id` DESC LIMIT 1) as total_due FROM invoice GROUP BY cus_id

答案 1 :(得分:3)

创建子查询以获取客户的最近total_due

SELECT cus_id, (select total_due from invoice where inv_id=max(a.inv_id)) as total_due FROM invoice a GROUP BY cus_id ORDER BY inv_id DESC

Demo here

答案 2 :(得分:2)

尝试此示例查询

SELECT i1.cus_id,i1.total_due FROM invoice as i1
LEFT JOIN invoice AS i2 ON i1.cus_id=i2.cus_id AND i1.inv_id<i2.inv_id
WHERE i2.inv_id IS NULL  

答案 3 :(得分:1)

只需根据cus_id组和inv_id的降序给出一个行号。然后选择行号为1的行。

<强>查询

select t1.cus_id, t1.total_due from (
    select cus_id, total_due, (
        case cus_id when @a 
        then @b := @b + 1 
        else @b := 1 and @a := cus_id end 
    ) as rn 
    from your_table_name t, 
    (select @b := 0, @a := '') r 
    order by cus_id, inv_id desc 
) t1 
where t1.rn = 1
order by t1.cus_id;

<强> Find a demo here

答案 4 :(得分:0)

查询:

SELECT cus_id, total_due FROM invoice GROUP BY cus_id ORDER BY inv_id DESC 
由于total_due子句中的SELECT列,

是无效的SQL。

允许在GROUP BY子句中包含SELECT的查询:

  1. 表达式也存在于GROUP BY子句中;
  2. 使用aggregate functions(又名“GROUP BY”函数)的表达式;
  3. 功能上依赖于GROUP BY子句中存在的列的列。
  4. 表达式total_due不属于上述情况。

    在5.7.5版本之前,MySQL曾经接受过这样的无效查询。但是,服务器可以return indeterminate values for the invalid expressions免费使用。从版本5.7.5开始,MySQL拒绝这样的查询(其他RDBMS很久以前拒绝它们了......)。

    为什么这样的查询无效?

    因为GROUP BY查询从表中返回行。它创建它返回的行。对于它放在结果集中的每一行,它使用表中的一组行。组中的所有行对于GROUP BY子句中存在的表达式具有相同的值,但它们可能在SELECT子句中出现的其他表达式中具有不同的值。

    这个特定问题的正确解决方案是什么?

    我之前在StackOverflow上多次回答过这个问题。请查看this answerthis answerthis answerthis answer,并将您从中学到的内容应用于您的查询。