我想知道这两个查询之间的区别:第一个查询给了我所有的记录,就好了。
Select * from table1 where tender_id='$tender_id' group by supplier_name
但是在下面的查询中我添加了一个sum(case),但是我没有得到所需的输出。第一个查询显示所有记录,但第二个查询未显示所有记录。我犯了什么错误?
select cs.*, tender_id,
SUM(CASE WHEN ifmain = 'Yes' THEN total_inr ELSE 0 END) AS maintotal,
SUM(CASE WHEN ifmain = 'No' THEN total_inr ELSE 0 END) AS subtotal
from table1 cs
where cs.tender_id='$tender_id'
group by cs.supplier_name
我想知道第二个查询是否可以显示所有带条件的记录(tender_id)?或者它的迭代更多?
答案 0 :(得分:0)
在标准SQL中,包含GROUP BY子句的查询无法引用 选择列表中未分配的非聚合列 GROUP BY子句。 看(例如)https://dev.mysql.com/doc/refman/5.0/en/group-by-handling.html
使用GROUP BY子句时,MySQL有一个不幸的(在我看来是不正确的)默认行为。此查询在大多数SQL数据库中无效:
Select * from table1 where tender_id='$tender_id' group by supplier_name
如果已启用ONLY_FULL_GROUP_BY SQL模式,它在MySQL中无效。
我强烈建议您将使用GROUP BY的所有查询视为需要该子句中的所有非聚合列。 e.g。
select
cs.supplier_name
, SUM(CASE WHEN ifmain = 'Yes' THEN total_inr ELSE 0 END) AS maintotal
, SUM(CASE WHEN ifmain = 'No' THEN total_inr ELSE 0 END) AS subtotal
from table1 cs
where cs.tender_id='$tender_id'
group by
cs.supplier_name
如果您需要额外的列,例如
select
cs.supplier_name
, tender_id
, SUM(CASE WHEN ifmain = 'Yes' THEN total_inr ELSE 0 END) AS maintotal
, SUM(CASE WHEN ifmain = 'No' THEN total_inr ELSE 0 END) AS subtotal
from table1 cs
where cs.tender_id='$tender_id'
group by
cs.supplier_name
, tender_id
等等。当然,当您在group by子句中包含更多列时,您可能会增加生成的行数,但这就是GROUP BY应该如何工作。