Как вывести список записей из одной таблицы и одновременно просуммировать сумму из другой таблицы?

#sql #sql-server

#sql #sql-сервер

Вопрос:

Прежде всего, надеюсь, мой английский не так уж плох..

У меня проблема, которую я не могу решить. Дело в том, что я думаю о системе обработки заказов.. Пока у меня есть таблица, в которой регистрируется каждая статья, относящаяся к такому заказу

Идентификатор Tbl_orderLines, prod_week, article_id

Тогда у меня также есть таблица och, где сумма для каждой строки в tbl_orderLines регистрируется следующим образом

Tbl_inventory orderline_id, article_id, amount

Теперь article_id в обеих таблицах одинаковы (двойная запись) думал, что это будет проще сделать? Чего я хочу, так это получить доступную сумму каждой конкретной статьи в определенное время. Итак, я хочу иметь возможность перечислять каждую строку в Tbl_orderLInes и с помощью объединения получать сумму для каждой строки, но! Я также хочу получить общую сумму конкретной статьи. Поэтому я хочу суммировать столбец суммы из Tbl_inventory, где article_id совпадает со строкой из tbl_orderLines.

Это то, что у меня есть сейчас Tbl_orderLines

 id         prod_week        article_id    
 1           1130              2   
 2           1129              5          
 3           1129              2     
 4           1128              2   
  

Tbl_inventory

 orderLine_id         article_id      amount     
 1                       2               1          
 2                       5               2          
 3                       2               1          
 4                       2               2          
  

Результат должен быть примерно таким

 id         prod_week        article_id      amount     TotalAmount
 1           1130              2               1          4
 2           1129              5               2          2
 3           1129              2               1          3
 4           1128              2               2          2
  

Не знаю, возможно ли понять мой вопрос?
Я использую MSSQL..

Очень ценю любую помощь..

Комментарии:

1. Как узнать, какой неделе соответствует запись в Tbl_inventory ?

2. Или взаимосвязи таблиц? Вы хотите видеть как сумму, так и сумму сумм в одной и той же записи результата? Что представляет идентификатор в вашем результате? Я не думаю, что кто-нибудь может помочь вам с запросом, потому что это, по-видимому, фундаментальные проблемы с вашей предлагаемой моделью данных.

3. Идентификатор в tbl_orderLines соотносится с идентификатором orderLine_id в tbl_inventory. Соотношение такое же, как указано выше, поэтому в tbl_orderLInes у меня есть информация о неделе и так далее, А в tbl_inventory сохраняется количество каждой статьи. Итак, с помощью объединения я могу получить prod_week и сумму, но я также хочу сумму всех строк в tbl_inventory, где article_id совпадает..

Ответ №1:

Я полагаю, что первая часть вашего набора результатов достигается следующим образом.

 SELECT
  [order_line].id,
  [order_line].prod_week,
  [order_line].article_id,
  [inventory].amount
FROM
  Tbl_orderLines             AS [order_line]
INNER JOIN
  Tbl_inventory              AS [inventory]
    ON [inventory].orderline_id = [order_line].id
  

Однако я не уверен на 100% в столбце TotalAmount. Мое лучшее предположение — это то, что вы хотите…Сумма сумм за все предыдущие недели с тем же article_id?

 SELECT
  [order_line].id,
  [order_line].prod_week,
  [order_line].article_id,
  [inventory].amount,
  SUM([historic_inventory].amount) AS TotalAmount
FROM
  Tbl_orderLines             AS [order_line]
INNER JOIN
  Tbl_inventory              AS [inventory]
    ON [inventory].orderline_id = [order_line].id
INNER JOIN
  Tbl_orderLines             AS [historic_orders]
    ON [historic_orders].article_id = [order_line].article_id
    AND[historic_orders].prod_week <= [order_line].prod_week
INNER JOIN
  Tbl_inventory              AS [historic_inventory]
    ON [historic_inventory].orderline_id = [historic_order_line].id
GROUP BY
  [order_line].id,
  [order_line].prod_week,
  [order_line].article_id,
  [inventory].amount
  

Комментарии:

1. Ммммм, я не знаю, тебе придется сказать мне. В вашем вопросе, похоже, указано не совсем то, что вы хотели, это ответ, основанный на моих выводах. Я бы посоветовал попробовать это с образцами данных, чтобы посмотреть, дает ли это желаемые результаты.

2. Я хочу получить сумму сумм за все предыдущие недели с тем же article_id.. Я собираюсь настроить некоторые примеры данных, чтобы попробовать ваш exempel.. Большое спасибо

3. Я попробовал с некоторым примером, и ваш пример выше отлично работает, за исключением одной вещи.. Если есть одна статья за неделю «1131» с суммой 1, и есть такая же статья за неделю «1130» с суммой 3, то общее количество за неделю 1130 равно 4, а за неделю 1131 — 3. Правильным результатом было бы общее количество за неделю 1130 из 3 и за неделю 1131, если бы было 4 .. кажется, что это подводит итог в неправильном направлении….

4. Нашел это! 😉 Только что изменил следующее: И[historic_orders].prod_week >= [order_line].prod_week Большое спасибо, чувак!!

Ответ №2:

Я не могу получить именно то, что вы хотите, но я верю, что вы можете попробовать что-то подобное, чтобы улучшить идею для достижения вашей цели.

 CREATE TABLE [dbo].[inventory](
    [id] [int] NULL,
    [article_id] [int] NULL,
    [amount] [int] NULL
) ON [PRIMARY]

GO

CREATE TABLE [dbo].[orderLines](
    [id] [int] NULL,
    [prod_week] [int] NULL,
    [article_id] [int] NULL
) ON [PRIMARY]

GO

SELECT ol.id, 
       ol.prod_week, 
       ol.article_id, 
       i.amount, 
       SUM(amount) OVER (PARTITION BY i.article_id) AS totalAmount
  FROM dbo.orderLines AS ol, dbo.inventory AS i
 WHERE ol.id = i.id
 ORDER BY ol.id
  

Комментарии:

1. это потрясающе, именно то, что я хотел. Я действительно не понимаю код, но все же… Теперь я просто хочу добавить условие, при котором получается общая сумма, суммирующая все записи, а затем prod_week, так что это будет что-то вроде: ГДЕ prod_week >= prod_week? Это звучит странно, когда я это читаю, я правильно думаю??

2. Да, вы можете добавить любое условие. Предложения OVER и PARTITION являются расширениями SQL Server для ANSI SQL. Существуют другие функции ранжирования и агрегирования, которые предоставляет SQL Server. Вот ссылка; msdn.microsoft.com/en-us/library/ms173454.aspx

3. Хорошо, отлично.. Я пытался, но не понимаю, куда вставить условие, что мне нужна только сумма всех предыдущих недель с тем же article_id?

4. Я не думаю, что вы можете добавить условие к предложению OVER, чтобы достичь того, о чем просит OP (если я ошибаюсь, я хотел бы знать, как, это звучит очень мощно!)

5. Нет, не в предложении OVER… Очевидно, что вы можете добавить любые критерии фильтрации в предложение WHERE.