У меня есть вопрос с моим запросом, я должен создать отчет, но нет одинаковых данных.
вот моя база данных https://www.db-fiddle.com/f/2bA7StrBpz18tLFgAQh2QV/1
и это мой пример запроса, но результат неверен:
SELECT
a.IdBukti,c.LineName,a.LineID,a.Tanggal,b.TypeProduksi AS partnamemonthly,a.PartID AS partmonthly,a.QtyPlanning AS qtymonthly,
d.partnamedaily,d.partiddaily,d.qtydaily
FROM
trans_ppicbdt_dt a
INNER JOIN ms_part b ON b.PartId = a.PartID
INNER JOIN ms_line c ON c.LineID = a.LineID
INNER JOIN(SELECT
c.LineName,
a.LineID,
a.Tanggal,
b.TypeProduksi AS partnamedaily,
a.PartID AS partiddaily,
a.QtyPlanning AS qtydaily
FROM
trans_ppich a
INNER JOIN ms_part b ON b.PartId = a.PartID
INNER JOIN ms_line c ON c.LineID = a.LineID
WHERE
a.Tanggal = '2018-04-11' AND a.DivisiId='DI070' AND a.IdLocation='1'
GROUP BY
a.LineID,
a.PartID) d on d.LineID=a.LineID AND d.Tanggal=a.Tanggal
WHERE
a.Tanggal = '2018-04-11' AND a.DivisiId='DI070' AND a.IdLocation='1'
GROUP BY
a.LineID,
a.PartID
Итак, у меня есть 2 данных, первый ежемесячный план и второй ежедневный план. И я хочу получить такой результат
Можете ли вы помочь мне создать отчет в одном запросе
Мне проще (для меня) выяснить, как сформулировать запрос, если я могу сразу увидеть отношения. Вот как выглядели бы Ваши:
(monthly) (daily)
trans_ppicbdt_dt ms_line trans_ppich
---------------- ----------- --------------
IdUnik (primary) ----> LineID <---- IdBukti (FK)*
LineID ------------/ \--- LineID
Есть некоторые проблемы с вашей структурой, которые необходимо устранить при первой возможности:
ms_line
нужен первичный ключ. lineID
должен работать, если он уникален.trans_ppich
нужен первичный ключ. IdBukti
является внешним ключом к еще одной таблице.lineID
всех таблицах должен быть указатель на lineID
.Тем не менее, мы все еще можем добраться туда, куда вы хотите отправиться. Теперь, когда я вижу отношение, запрос действительно довольно прост в теории, но у меня нет всех необходимых таблиц и полей:
SELECT DISTINCT line.LineName,
monthly.{unknown field} as monthlyPartName,
monthly.PartID as monthlyPartID,
monthly.{unknown field} as monthlyProcess,
monthly.{unknown field} as monthlyQty,
daily.{unknown field} as dailyPartName,
daily.PartID as dailyPartID,
daily.{unknown field} as dailyQty,
{unknown table}.{unknown field} as remarks
FROM ms_line as line
LEFT JOIN trans_ppicbdt_dt AS monthly ON line.lineID=monthly.lineID
LEFT JOIN trans_ppich AS daily ON line.lineID=daily.lineID
WHERE
{your where clause to filter results}
Как это работает, он выполняет итерацию через (отдельные) позиции и ищет соответствие в ежемесячной таблице (left join monthly
). Если есть совпадение, оно добавляет значения. Если нет совпадения, он просто добавляет значение null
для значений. Затем он делает то же самое для ежедневной таблицы: если есть совпадение, оно добавляет значения, иначе оно просто дает значение null
для всех ежедневных значений.
Однако это развалится, если строка ID дублируется в строках ежемесячной и ежедневной таблиц.
Я не знаю, откуда берутся замечания, так что вы остаетесь для вас упражнением. :)
lineName
не является первичным (и даже не уникальным) ключом, теперь, когда я по-другому взгляну на него. Этот запрос ожидает , что там быть только один lineName
для каждой строки в ms_line
. Вы можете бросить DISTINCT
перед line.linename
, и этот запрос, вероятно, будет работать. Однако я сомневаюсь, что ваша база данных нормализована, поскольку внешний ключ в двух других таблицах не ссылается на уникальный ключ. Я бы предложил почитать о нормализации базы данных; С правильно нормализованной базой данных работать гораздо проще, чем с другой.