SQL-запрос для отчета дает неправильный результат - PullRequest
0 голосов
/ 25 июля 2011

У меня есть эта проблема, касающаяся SQL, который я буду использовать в веб-сервисе, если смогу сделать это правильно. То, что я хотел сделать, это создать сводный отчет о транзакции. У транзакции есть заголовок и строки. В транзакции мы собираемся ввести много досок.

После ввода я хотел бы подготовить отчет, в котором будут добавлены все доски, относящиеся к категории, а затем умножены все доски на цену этого поставщика, чтобы у меня была общая сумма. Вот картинка: enter image description here

ниже мой sql, который выдает неправильный вывод:

select
      t1.transaction_num,
      wo1.wood_classification_desc,
      wo2.wood_specie_desc,
      sum(t2.board_foot) as total_board_foot,
      su1.price,
      sum(t2.board_foot*su1.price) as total_amount
    from
      "transaction_hdr" t1
      left join "transaction_lne" t2 on (t1.transaction_id = t2.transaction_id)
      left join "supplier" su2 on (t1.supplier_id = su2.supplier_id)
      left join "supplier_price" su1 on (t2.price = su1.price)
      left join "wood_classification" wo1 on (t2.wood_classification_id = wo1.wood_classification_id)
      left join "wood_specie" wo2 on (wo1.wood_specie_id = wo2.wood_specie_id)
    group by
      t1.transaction_num,wo1.wood_classification_desc,su1.price,su2.supplier_name,wo2.wood_specie_desc
    order by transaction_num,wo2.wood_specie_desc

Каждый раз, когда я запускаю этот sql, он производит что-то вроде этого: enter image description here

транзакция, которую я проверяю, имеет только пять планок. 4 доски под Mahogany 6" wider - 7ft. up и 1 Mahogany 5" wider - 7ft. up.

Ответы [ 3 ]

2 голосов
/ 25 июля 2011

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

Просто запустите SQL без группировки и проверьте, что вы получите.

Так что, вероятно, проблема не в умножении, а в сумме.

1 голос
/ 25 июля 2011

У вас есть более одной записи в supplier_price с ценой = 13,33? Это было бы моим предположением, поскольку все другие объединения, кажется, находятся на первичных ключах ..

EDIT:

Ваша проблема в том, что вы присоединяетесь к supplier_price в поле цены, которое не является допустимым ключом. Учитывая, что ваш вывод ничего не берет из таблицы supplier_price, я был бы склонен полностью удалить его из запроса, как показано ниже:

select
      t1.transaction_num,
      wo1.wood_classification_desc,
      wo2.wood_specie_desc,
      sum(t2.board_foot) as total_board_foot,
      t2.price,
      sum(t2.board_foot*t2.price) as total_amount
    from
      "transaction_hdr" t1
      left join "transaction_lne" t2 on (t1.transaction_id = t2.transaction_id)
      left join "supplier" su2 on (t1.supplier_id = su2.supplier_id)
      left join "wood_classification" wo1 on (t2.wood_classification_id = wo1.wood_classification_id)
      left join "wood_specie" wo2 on (wo1.wood_specie_id = wo2.wood_specie_id)
    group by
      t1.transaction_num,wo1.wood_classification_desc,t2.price,su2.supplier_name,wo2.wood_specie_desc
    order by transaction_num,wo2.wood_specie_desc
0 голосов
/ 25 июля 2011

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

select
      t1.transaction_num,
      wo1.wood_classification_desc,
      wo2.wood_specie_desc,
      sum(t2.board_foot)
        as total_board_foot,
      ( SELECT DISTINCT su1.price
        FROM "supplier_price" su1
        WHERE t2.price = su1.price
      ) AS price,
      sum(t2.board_foot) *
          ( SELECT DISTINCT su1.price
            FROM "supplier_price" su1
            WHERE t2.price = su1.price
          )
        as total_amount
    from
      "transaction_hdr" t1
      left join "transaction_lne" t2
        on (t1.transaction_id = t2.transaction_id)
      left join "supplier" su2 
        on (t1.supplier_id = su2.supplier_id)
      left join "wood_classification" wo1
        on (t2.wood_classification_id = wo1.wood_classification_id)
      left join "wood_specie" wo2
        on (wo1.wood_specie_id = wo2.wood_specie_id)
    group by
        t1.transaction_num
      , wo1.wood_classification_desc
      , su2.supplier_name
      , wo2.wood_specie_desc
    order by transaction_num
           , wo2.wood_specie_desc
...