[英]Column is “invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause”
I have an INV_MASTER table which stores the list of items in the inventory each day, and an ITEM_MASTER table which has the list of items and its details (eg. department, sub-department, class, sub-class, etc.). 我有一个INV_MASTER表,该表每天存储库存中的项目列表,还有一个ITEM_MASTER表,其中包含项目列表及其详细信息(例如,部门,子部门,类,子类等)。
I am trying to write a query to fetch the list of items(INV_MASTER) in the inventory from the date range, arranged in ascending order according to the item's category(ITEM_MASTER). 我正在尝试编写一个查询,以从日期范围中获取清单中的物品清单(INV_MASTER),并根据物品的类别(ITEM_MASTER)以升序排列。 Here is my query its throwing exception. 这是我的查询的抛出异常。
SELECT
INV_MASTER.LOC_CODE,
INV_MASTER.INV_DATE,
INV_MASTER.ITEM_CODE,
INV_MASTER.ITEM_DESC,
INV_MASTER.UNIT_DESC,
FIRST(INV_MASTER.BEG_QTY),
SUM(INV_MASTER.SOLD_QTY),
SUM(INV_MASTER.REC_QTY),
SUM(INV_MASTER.RET_QTY),
SUM(INV_MASTER.ADJ_QTY),
SUM(INV_MASTER.COUNT_P),
SUM(INV_MASTER.COUNT_C),
SUM(INV_MASTER.TRANS_IN),
SUM(INV_MASTER.TRANS_OUT),
LAST(INV_MASTER.END_QTY),
ITEM_MASTER.*
FROM INV_MASTER
LEFT OUTER JOIN ITEM_MASTER ON INV_MASTER.ITEM_CODE=ITEM_MASTER.ITEM_CODE
WHERE ITEM_MASTER.DEPARTMENT = '$department' AND ITEM_MASTER.SUB_DEPARTMENT = '$subdepartment' AND ITEM_MASTER.CLASS = '$class' AND ITEM_MASTER.SUB_CLASS = '$subclass' AND INV_MASTER.INV_DATE BETWEEN '$from' AND '$to'
GROUP BY INV_MASTER.LOC_CODE, INV_MASTER.ITEM_CODE
ORDER BY ITEM_MASTER.$type_desc, INV_MASTER.INV_DATE, ITEM_MASTER.ITEM_CODE
Here's my code for printing: 这是我的打印代码:
while($row = ibase_fetch_assoc($sql))
{
$inv_date = $row['INV_DATE'];
$item_code = $row['ITEM_CODE'];
$item_desc = $row['ITEM_DESC'];
$unit_desc = $row['UNIT_DESC'];
$sold_qty = $row['SUM(SOLD_QTY)'];
$beg_qty = $row['FIRST(BEG_QTY)'];
$rec_qty = $row['SUM(REC_QTY)'];
$ret_qty = $row['SUM(RET_QTY)'];
$adj_qty = $row['SUM(ADJ_QTY)'];
$count_p_qty = $row['SUM(COUNT_P)'];
$count_c_qty = $row['SUM(COUNT_C)'];
$trans_in_qty = $row['SUM(TRANS_IN)'];
$trans_out_qty = $row['SUM(TRANS_OUT)'];
$end_qty = $row['LAST(END_QTY)'];
*printing part here*
}
The error messages says it: All columns in the SELECT
clause must be either aggregate functions (eg SUM
, FIRST
) or in the GROUP BY
clause. 错误消息说明了这一点: SELECT
子句中的所有列都必须是集合函数(例如SUM
, FIRST
)或GROUP BY
子句中的。
You have 你有
INV_MASTER.LOC_CODE, INV_MASTER.ITEM_CODE
in the GROUP BY
clause, but you SELECT 在GROUP BY
子句中,但是您选择
INV_MASTER.LOC_CODE,
INV_MASTER.INV_DATE,
INV_MASTER.ITEM_CODE,
INV_MASTER.ITEM_DESC,
INV_MASTER.UNIT_DESC,
ITEM_MASTER.*
without any aggregate function. 没有任何汇总功能。 Either 或
SELECT
clause or 从SELECT
子句中删除不需要的非聚合列,或者 GROUP BY
clause by these columns 通过这些列扩展GROUP BY
子句 As far as I can tell from your PHP code, you only need the non-aggregated columns 据我从您的PHP代码可以看出,您只需要未聚合的列
INV_DATE, ITEM_CODE, ITEM_DESC, UNIT_DESC
in the SELECT
part. 在SELECT
部分。 So remove the rest and make sure that the GROUP BY
contains all these four columns. 因此,删除其余部分,并确保GROUP BY
包含所有这四个列。
Edit: Based on the SqlFiddle input 编辑:基于SqlFiddle输入
The SQL Fiddle data is not really complete, and the request looks very different than in the first question (where you had far more items in the WHERE clause), but I managed to get a running statement. SQL Fiddle数据并没有真正完成,并且请求看起来与第一个问题(在WHERE子句中有更多项目)中的请求截然不同,但是我设法获得了一条正在运行的语句。
SELECT
ITEM_MASTER.ITEM_CODE,
ITEM_MASTER.ITEM_DESC,
ITEM_MASTER.UNIT_DESC,
ITEM_MASTER.CLASS,
MIN(INV_MASTER.BEG_QTY),
SUM(INV_MASTER.SOLD_QTY),
SUM(INV_MASTER.REC_QTY),
SUM(INV_MASTER.RET_QTY),
SUM(INV_MASTER.ADJ_QTY),
SUM(INV_MASTER.COUNT_P),
SUM(INV_MASTER.COUNT_C),
SUM(INV_MASTER.TRANS_IN),
SUM(INV_MASTER.TRANS_OUT),
MAX(INV_MASTER.END_QTY)
FROM INV_MASTER
LEFT OUTER JOIN ITEM_MASTER ON INV_MASTER.ITEM_CODE=ITEM_MASTER.ITEM_CODE
WHERE INV_MASTER.INV_DATE BETWEEN '2015-10-27' AND '2015-10-31'
GROUP BY ITEM_MASTER.ITEM_CODE, ITEM_MASTER.ITEM_DESC, ITEM_MASTER.UNIT_DESC, ITEM_MASTER.CLASS
ORDER BY ITEM_MASTER.ITEM_CODE, INV_MASTER.INV_DATE, ITEM_MASTER.ITEM_CODE
I hope this is more or less what you want, I think it'll be easy to adapt anyway. 我希望这或多或少是您想要的,无论如何我都会觉得很容易适应。 As your inserted data in SQLFiddle did not include all fields, I couldn't really get the same results as you wish. 由于您在SQLFiddle中插入的数据未包含所有字段,因此我无法真正获得所需的结果。
Keep in mind, MySQL does not know the functions FIRST
and LAST
, therefore I have changed them to MIN and MAX, not sure, if that's ok, though. 请记住,MySQL 不知道的功能FIRST
和LAST
,所以我让他们改变MIN和MAX,不知道,如果这是好的,但。
from the tables and sample data here http://www.sqlfiddle.com/#!9/b823f the output should look something like this when i query dates from '2015-10-27'
to '2015-10-31'
. 从表和此处的示例数据http://www.sqlfiddle.com/#!9/b823f中 ,当我查询从'2015-10-27'
到'2015-10-31'
日期时,输出应类似于以下内容。 it should also be group according to its item's department (eg. metal, painting..) 还应根据其项目的部门进行分组(例如,金属,油漆..)
ITEM_CODE | ITEM_DESC | UNIT_DESC | CLASS | BEG | + | - | - | - | + | + | + | + | - | - | END
METAL
000000000MS016 | MS RHS 50 X 150 X 3MM X 6M | LENGTH | NONE | 12.5 |20 |25 | 0 | 0 | 0 | 0 | 0 |30 | 0 | 5 | 32.5
PAINTING
000000000PN044 | DURAPATCH BODYFILLER W/ CREAM HARDENER | GALLON/S | NONE | 0 |70 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 5 | 0 | 65
NONE
000000000VI064 | TURQOUISE STICKER 3630-236 | SQR FT | NONE | 440 | 5 | 0 |10 | 0 |10 | 0 | 0 | 0 | 8 | 0 | 437
ART
000000000VI029 | 3M PLUM PURPLE 3630-128 | SQR FT | NONE | 274 |35 |10 | 0 |25 | 0 | 0 | 6 | 0 | 3 | 4 | 273
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.