Допустим имеем таблицу в БД Access: Как из неё вычленить и вывести вот такое: При этом оборудование которое выдано не должно учитываться.
я попробовал реализовать через чистый запрос и выглядит это кодом так: Код (Text): <?php $num = 0; $connect = odbc_connect("wobdv120", "", ""); $q = "SELECT RecPart as `Тип оборудования`, (sum(LocCur = 'ready')+sum(LocCur = 'stock')+sum(LocCur = 'scrap')) as Всего, sum(LocCur = 'ready') as Готовое, sum(LocCur = 'stock') as `Ремонтный фонд`, sum(LocCur = 'scrap') as `Всего отдефектовано` FROM DataWO WHERE PceType=61 GROUP BY RecPart"; $result = odbc_prepare($connect,$q); // Выполнить запрос и вывести результаты odbc_execute($result); odbc_result_all($result, "BGCOLOR='#E0ECF8' border=1"); // Закрыть соединение odbc_close($connect); echo $q; ?> Но результат совершенно удивительный: Почему выглядит так совершенно непонятно))) Рысканье по разным материалам не помогло исправить ситуацию. Более того, не исключаются позиции которые не входят в критерий и не получается добавить дополнительные условия по выборке при учете других критериев.
до конца не вник, но возможно стоит использовать count() вместо sum(). у тебя же чисел нет в базе, что они там суммируют функцией sum() ?
суммируется наличие такой строки, каунтом не считает, пробовал. Причем суммируется то правильно, только вот почему то отрицательное число выдает и со знаком после запятой. И опять же повторюсь, не получается исключить данные с нулями. Чтобы прост оен выводилась эта строка если такое оборудование не имеет строк с необходимыми состояниями. Он выводит и прост опишет нули --- Добавлено --- при использовании каунта выдает вот это, то есть почему то есть считает просто общее количество строк группируемых по критериям без разбиения на состояния оборудования))):
@kretsman, вот тебе пища для размышления: Код (Text): SELECT `RecPart`, COUNT(*) AS `total`, `s`.`scrap` FROM `DataWO` LEFT JOIN (SELECT `RecPart`, COUNT(*) AS `scrap` FROM `DataWO` WHERE `LocCur` = 'брак' GROUP BY `RecPart`) AS `s` USING(`RecPart`) WHERE `LocCur` <> 'выдан' GROUP BY `RecPart` ORDER BY `RecPart` Сможешь добавить остальные поля по аналогии?
Осталось только понять что вы подразумеваете под "`s`.`scrap`" --- Добавлено --- к сож к сожалению до меня не дошла логика того что вы прислали, я не понял что значит `s`.`scrap` и дальнейшая ваша логика мне так и не поддалась
А чего там подразумевать, я даже объявление алиасов (AS) не опускал. `scrap` - это поле брак из таблицы `s`, которая формируется в результате вложенного запроса и присоединяется к основной таблице. Грубо говоря сколько колонок хотите получить, столько и соединений (LEFT JOIN) надо использовать. --- Добавлено --- это не моя логика это основы SQL
к сож к сожалению до меня не дошла логика --- Добавлено --- Проблема в том что я вбил ваше, даже названия столбцов проставил и все равно не работает, ругается запрос, не выполняется. попробовал с одним столбцом, не работает --- Добавлено --- приведите конкретный пример исходя из того вопроса который я задал в начале, я спецаильн оег оупростил чтобы понять лоегче ответ. а тут выходит я ваш код не понимаю, я не понимаю как его изменить под свою таблику, вы scrap у меня это состояние "брак" а не наименование столбца. Я же нормальный пример дал изначально. есть столбец LocCur в котором есть значения "scrap", "shipped", "ready", "stock"
я это вижу, теперь вам надо понять, что из столбца LocCur для того что бы реализовать логику необходимо сделать столько виртуальных таблиц сколько полей вы хотите получить. Открою маленький секрет, результат любого запроса - это таблица. И нам ничто не мешает в конструкции FROM использовать не название настоящей таблицы, а подзапрос Код (Text): SELECT `RecPart`, COUNT(*) AS `scrap` FROM `DataWO` WHERE `LocCur` = 'брак' GROUP BY `RecPart` , правда, что бы бд не ругалась надо использовать алиас, и обозвать эту нашу виртуальную таблицу. Код (Text): AS `s` Скажу честно с ACCESS я сталкивался очень давно и то мимоходом. С джоинами оно нормально дружит https://support.office.com/ru-ru/article/Операции-left-join-right-join-ebb18b36-7976-4c6e-9ea1-c701e9f7f5fb может USING не понимает, тогда взамест него ON `DataWO`.`RecPart` = `s`.`RecPart` надо
Я ничего не понял исходя из связки первого вашего предложенного ответа и второго. Проверьте, вы точно не допустили ошибок в первом вашем ответе? Просто одно с другим не бьется как то --- Добавлено --- Вы такого наворотили в ответах, везде разное, не понятно совсем ничего. Я прошу вас примените свою логику к тому конкретному примеру который я в самом первом посте оставило, на нем я пойму. А тут какая-то билиберда получается
я то точно не допустил ошибок, просто запрос надо подкорректировать под ваши реальные таблицы, а мой запрос для вашей упрощённой таблицы из первого сообщения.
да, а еще там нет названия таблицы? это не смущает? что трудного в моём ответе заменить RecPart на `прибор`, а LocCur на `состояние`?
Что означает в вашем ответе это? --- Добавлено --- Код (Text): SELECT `RecPart`, COUNT(LocCur) AS `total`, `s`.`scrap` FROM `DataWO` LEFT JOIN (SELECT `RecPart`, COUNT(LocCur) AS `scrap` FROM `DataWO` WHERE `LocCur` = 'scrap' GROUP BY `RecPart`) AS `s` USING(`RecPart`) WHERE PceType=61 and LocCur <> 'shipped' GROUP BY RecPart Вот запрос по вашему мотиву и вот какая ошибка выдается: Warning: odbc_prepare() [function.odbc-prepare]: SQL error: [Microsoft][Драйвер ODBC Microsoft Access] Ошибка синтаксиса в предложении FROM., SQL state 37000 in SQLPrepare inZ:\home\lepus\www\invneo.php on line 15 Warning: odbc_execute(): supplied argument is not a valid ODBC result resource in Z:\home\lepus\www\invneo.php on line 18 Warning: odbc_result_all(): supplied argument is not a valid ODBC result resource in Z:\home\lepus\www\invneo.php on line 19
`s` - это алиас виртуальной таблицы которая формируется в результате вложенного запроса SELECT `RecPart`, COUNT(*) AS `scrap` FROM `DataWO WHERE `LocCur` = 'брак' GROUP BY `RecPart`) AS `s` `scrap` - это поле алиас количества COUNT(*) AS `scrap` из всё того же вложенного запроса Может вот так будет понятнее: Код (Text): SELECT `прибор`, COUNT(*) AS `общее количество`, `виртуальная таблица брака`.`виртуальное поле количества брака` FROM `DataWO` LEFT JOIN (SELECT `прибор`, COUNT(*) AS `виртуальное поле количества брака` FROM `DataWO` WHERE `состояние` = 'брак' GROUP BY `прибор`) AS `виртуальная таблица брака` ON `DataWO`.`прибор` = `виртуальная таблица брака`.`прибор` WHERE `состояние` <> 'выдан' GROUP BY `прибор` ORDER BY `прибор` --- Добавлено --- я же написал может access не понимает USING и написал чем его заменить, попробуй вот этот последний запрос, вместо `DataWO` подставь имя своей таблицы из первого сообщения P.S. Я так понимаю соединения JOIN ты видишь первый раз в жизни?
вижу не первый раз в жизни, правда им до этог оне пользовался. Замена USING на ON не изменила ничего, ошибки выдает те же
$q = "SELECT `RecPart`, COUNT(LocCur) AS `total`, `s`.`scrap` FROM `DataWO` LEFT JOIN (SELECT `RecPart`, COUNT(LocCur) AS `scrap` FROM `DataWO` WHERE `LocCur` = 'scrap' GROUP BY `RecPart`) AS `s` on `RecPart` WHERE PceType=61 and LocCur <> 'shipped' GROUP BY RecPart"; Выдаваемые ошибки: Warning: odbc_prepare() [function.odbc-prepare]: SQL error: [Microsoft][Драйвер ODBC Microsoft Access] Не поддерживается выражение объединения., SQL state S1000 in SQLPrepare inZ:\home\lepus\www\invneo.php on line 15 Warning: odbc_execute(): supplied argument is not a valid ODBC result resource in Z:\home\lepus\www\invneo.php on line 18 Warning: odbc_result_all(): supplied argument is not a valid ODBC result resource in Z:\home\lepus\www\invneo.php on line 19
$q = "SELECT `RecPart`, COUNT(`LocCur`) AS `total`, `s`.`brak` FROM `DataWO` LEFT JOIN (SELECT `RecPart`, COUNT(`LocCur`) AS `brak` FROM `DataWO` WHERE `LocCur` = 'scrap' GROUP BY `RecPart`) AS `s` ON `DataWO`.`RecPart` = `s`.`RecPart` WHERE `PceType` = 61 AND `LocCur` <> 'shipped' GROUP BY `RecPart`"; Теперь сделай кописат отсюда И внимательнее читай ответы на свои вопросы, это в первую очередь надо тебе, а не мне.
Выдало вот такую ошибку Warning: odbc_execute() [function.odbc-execute]: SQL error: [Microsoft][Драйвер ODBC Microsoft Access] Ссылка на поле '`RecPart`' может относиться к полям нескольких таблиц, перечисленных в предложении FROM инструкции SQL., SQL state S1000 in SQLExecute in Z:\home\lepus\www\invneo.php on line 18
вот тут GROUP BY `RecPart`) AS `s` перед AS поставь пробел на всякий случай, блин да у тебя они там везде без пробелов, тьфу, хотя нет вроде есть пробелы --- Добавлено --- $q = "SELECT `RecPart`, COUNT(`LocCur`) AS `total`, `s`.`brak` FROM `DataWO` LEFT JOIN (SELECT `RecPart` AS `r`, COUNT(`LocCur`) AS `brak` FROM `DataWO` WHERE `LocCur` = 'scrap' GROUP BY `RecPart`) AS `s` ON `DataWO`.`RecPart` = `s`.`r` WHERE `PceType` = 61 AND `LocCur` <> 'shipped' GROUP BY `RecPart`"; попробуй вот так, тьфу нет вот так $q = "SELECT `DataWO`.`RecPart`, COUNT(`LocCur`) AS `total`, `s`.`brak` FROM `DataWO` LEFT JOIN (SELECT `RecPart` AS `r`, COUNT(`LocCur`) AS `brak` FROM `DataWO` WHERE `LocCur` = 'scrap' GROUP BY `RecPart`) AS `s` ON `DataWO`.`RecPart` = `s`.`r` WHERE `PceType` = 61 AND `LocCur` <> 'shipped' GROUP BY `RecPart`";
Пробелы есть везде, но вот не арбайтен, простите что достаю вас, хочу нормально разобраться, чтобы понять что к чему. Теперь вот такую ошибку пишет: Warning: odbc_execute() [function.odbc-execute]: SQL error: [Microsoft][Драйвер ODBC Microsoft Access] Попытка выполнить запрос, который не включает указанное выражение 'brak' как часть статистической функции или группы., SQL state 37000 in SQLExecute in Z:\home\lepus\www\invneo.php on line 18
$q = "SELECT `DataWO`.`RecPart`, COUNT(`LocCur`) AS `total`, `s`.`brak` FROM `DataWO` LEFT JOIN (SELECT `RecPart` AS `r`, COUNT(`LocCur`) AS `brak` FROM `DataWO` WHERE `LocCur` = 'scrap' GROUP BY `RecPart`) AS `s` ON `DataWO`.`RecPart` = `s`.`r` WHERE `PceType` = 61 AND `LocCur` <> 'shipped' GROUP BY `RecPart`"; я уже потихоньку ненавижу access, пробуй так