#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.