Создать табличный отчет из присоединяющейся таблицы в MySQL

0

У меня есть вопрос с моим запросом, я должен создать отчет, но нет одинаковых данных.

вот моя база данных 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 данных, первый ежемесячный план и второй ежедневный план. И я хочу получить такой результат Изображение 174551

Можете ли вы помочь мне создать отчет в одном запросе

  • 0
    Подобные требования к форматированию должны обрабатываться на уровне представления, например, в PHP.
  • 0
    я отредактировал свой вопрос, посмотрю
Показать ещё 8 комментариев
Теги:

1 ответ

0
Лучший ответ

Мне проще (для меня) выяснить, как сформулировать запрос, если я могу сразу увидеть отношения. Вот как выглядели бы Ваши:

(monthly)                                  (daily)
trans_ppicbdt_dt          ms_line          trans_ppich 
----------------          -----------      --------------  
IdUnik (primary)    ----> LineID <----     IdBukti (FK)*
LineID ------------/                  \--- LineID

Есть некоторые проблемы с вашей структурой, которые необходимо устранить при первой возможности:

  1. ms_line нужен первичный ключ. lineID должен работать, если он уникален. (нет такой удачи, она не уникальна)
  2. trans_ppich нужен первичный ключ. IdBukti является внешним ключом к еще одной таблице.
  3. lineID всех таблицах должен быть указатель на lineID.
  4. Таблицы необходимо нормализовать. Вам не нужно повторять данные по нескольким строкам.

Тем не менее, мы все еще можем добраться туда, куда вы хотите отправиться. Теперь, когда я вижу отношение, запрос действительно довольно прост в теории, но у меня нет всех необходимых таблиц и полей:

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 дублируется в строках ежемесячной и ежедневной таблиц.

Я не знаю, откуда берутся замечания, так что вы остаетесь для вас упражнением. :)

  • 0
    с вашим запросом это дает мне 4 строки, фактически в моих ожидаемых результатах только 2 строки, как на моей картинке выше. Потому что в моем отчете 2 колонны. первый ежемесячный отчет и второй ежедневный отчет.
  • 0
    Ах, это потому, что lineName не является первичным (и даже не уникальным) ключом, теперь, когда я по-другому взгляну на него. Этот запрос ожидает , что там быть только один lineName для каждой строки в ms_line . Вы можете бросить DISTINCT перед line.linename , и этот запрос, вероятно, будет работать. Однако я сомневаюсь, что ваша база данных нормализована, поскольку внешний ключ в двух других таблицах не ссылается на уникальный ключ. Я бы предложил почитать о нормализации базы данных; С правильно нормализованной базой данных работать гораздо проще, чем с другой.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню