SQL select查询,其中所有行必须具有相等的值

时间:2011-01-26 18:30:28

标签: sql mysql greatest-n-per-group

我需要从订单列表中生成帐单。

我有一个查询,我得到所有尚未支付的订单(paid_date = null),但问题是某些订单有不同的税码。现在,我只能在该查询中将订单与相同的税码组合在一起。

我正在考虑下面的内容,但这显然不起作用:

SELECT * from orders 
WHERE paid_date IS NULL AND tax_code = MAX(tax_code);

几乎像一个反特色。

更新:
对不起,我想问题不明确。我不是在寻找税码。我正在寻找所有具有相同税码的订单清单。但我不关心它是哪个代码。这实际上只是一种安全措施,通常所有税码都是相同的,但在极少数情况下它们是不同的。在这种情况下,用户需要生成2个单独的账单。

任何简单的想法?

4 个答案:

答案 0 :(得分:2)

您需要确定除税码之外的其他列,例如,也许是customer_ID(例如);

获取当前客户的tax_codes列表:

SELECT customer_ID, tax_code
FROM Orders
WHERE customer_ID = 'some customer ID'
GROUP BY customer_ID, tax_code

上面的查询将返回不同行的数量,因此如果有2个tax_codes; 然后你得到2行,需要生成2个账单;

然后你可以像其他人一样查询:

SELECT * FROM Orders
WHERE paid_date IS NULL
AND tax_code = 'first tax code from your first query'

这将涉及到DB的多次访问。或者,您可以编写存储过程,使用临时表,并返回多个集合(多个SELECT语句),每个集合包含tax_code的表格列表。

或者,如果您使用的是SQL(不了解MySQL),您可以编写SQL XML查询,该查询将通过customer_id和tax_code返回分层数据。

这有帮助吗?

答案 1 :(得分:1)

坚持原始查询,子查询会这样做:

SELECT * from orders 
 WHERE paid_date IS NULL 
   AND tax_code = (
       select max(tax_code)
         from orders
        where paid_date is null
   )

答案 2 :(得分:0)

您应该按tax_code订购并获取tax_code订购的订单列表:

select * from orders
  where paid_date is null
 order by tax_code

然后迭代你的结果。只要您有一个明确的tax_code生成新帐单。

group_concat可能会给你你想要的东西:

select tax_code, group_concat(order_id order by order_id) from orders
  where paid_date is null
 group by tax_code
-- optionally you can use a LIMIT 1 if you just want orders for the first tax_code

答案 3 :(得分:0)

在此示例中,我从订单列表中随意选择了tax_code,因为您没有向我们提供有关如何选择所选tax_code的详细信息。

Select ..
From Orders As O
    Join    (
            Select O1.tax_code
            From Orders As O1
            Limit 1
            ) As Z
        On Z.tax_code = O.tax_code
Where paid_date Is Null

这里的问题是子查询可能会发现tax_code只与一个订单相关联,因为绝大多数订单与另一个tax_code相关联。另一种找到“最常见”税码的解决方案是:

Select ..
From Orders As O
    Join    (
            Select O1.tax_code
            From Orders As O1
            Group By O1.tax_code
            Order By Count(*) Desc
            Limit 1
            ) As Z
        On Z.tax_code = O.tax_code
Where paid_date Is Null