У меня есть таблица 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*
}
Сообщение об ошибке говорит это: Все столбцы в 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, не уверен, если это нормально, хотя.
из таблиц и образцов данных здесь 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