Столбец & quot; недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY & quot;

У меня есть таблица INV_MASTER, в которой каждый день хранится список предметов в инвентаре, и таблица ITEM_MASTER, в которой есть список предметов и их данные (например, отдел, подразделение, класс, подкласс и т. Д.).

Я пытаюсь написать запрос для получения списка товаров (INV_MASTER) в инвентаре из диапазона дат, расположенного в порядке возрастания в соответствии с категорией товара (ITEM_MASTER). Вот мой запрос, его исключение.

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

Вот мой код для печати:

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*
}

2

Решение

Сообщение об ошибке говорит это: Все столбцы в SELECT предложение должно быть либо агрегатными функциями (например, SUM, FIRST) или в GROUP BY пункт.

У тебя есть

INV_MASTER.LOC_CODE, INV_MASTER.ITEM_CODE

в GROUP BY пункт, но вы выбираете

INV_MASTER.LOC_CODE,
INV_MASTER.INV_DATE,
INV_MASTER.ITEM_CODE,
INV_MASTER.ITEM_DESC,
INV_MASTER.UNIT_DESC,
ITEM_MASTER.*

без какой-либо агрегатной функции. Или

  • Удалите неагрегированные столбцы, которые вам не нужны, из SELECT пункт или
  • Расширить GROUP BY пункт по этим столбцам

Насколько я могу судить по вашему PHP-коду, вам нужны только неагрегированные столбцы

INV_DATE, ITEM_CODE, ITEM_DESC, UNIT_DESC

в SELECT часть. Так что удалите остальные и убедитесь, что GROUP BY содержит все эти четыре столбца.

Изменить: на основе ввода SqlFiddle

Данные 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

Я надеюсь, что это более или менее то, что вы хотите, я думаю, что все равно будет легко адаптироваться. Поскольку ваши вставленные данные в SQLFiddle не включали в себя все поля, я не смог получить те же результаты, что и вы.

Имейте в виду, MySQL делает не знать функции FIRST а также LASTпоэтому я изменил их на MIN и MAX, не уверен, если это нормально, хотя.

4

Другие решения

из таблиц и образцов данных здесь http://www.sqlfiddle.com/#!9/b823f вывод должен выглядеть примерно так, когда я запрашиваю даты из '2015-10-27' в '2015-10-31', оно также должно быть сгруппировано в соответствии с отделом его предмета (например, металл, живопись ..)

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
0

По вопросам рекламы [email protected]