#sql #sql-server
#sql #sql-server
Вопрос:
Для класса я создаю базу данных, которая отслеживает мои финансы. У меня есть таблица для каждого типа товара, который я покупаю. Например, Rent
, Food
, Hygiene
Entertainment
и т.д… У меня также есть таблица с именем Register
, в которой я хочу отобразить месячный итог по каждому элементу. Имена столбцов для итогов в таблицах следующие: MonthlyRentTotal
, MonthlyFoodTotal
и т.д… Я хочу, чтобы Register
таблица извлекала итоговые данные из каждой таблицы, чтобы мне не приходилось вводить их дважды. Есть идеи о том, как я могу это сделать? Я тоже не хочу создавать представление. Я хочу, чтобы это была реальная таблица. Я даже не уверен, возможно ли это.
Комментарии:
1. Наличие разных таблиц для каждого типа покупки кажется здесь недостатком. У вас должна быть 1 таблица для покупок со столбцом категория / тип. Наличие отдельной таблицы для каждого типа покупки не приведет к масштабированию и потребует значительных изменений в вашем коде каждый раз, когда добавляется новый тип. Арендную плату я могу возможно видеть как другую таблицу, в зависимости от дизайна. Все остальное, еда, гигиена, развлечения — это покупки физических товаров, где аренда — это услуга. Поэтому, в зависимости от требований, у вас может быть 2 таблицы для служб и покупок; но недостаточно подробных сведений, чтобы знать.
2. Таблицы не «извлекаются» из других таблиц. Запросы делают это. Я предлагаю вам сделать шаг назад и подумать о вашем подходе. Здесь следует учитывать ваш класс (и его назначение) — это дизайн базы данных? Если нет, изучали ли вы дизайн БД вообще? То, что вы описываете, можно сделать, но для этого потребуется код, и это не типичный подход. Возможно, вам следует взглянуть на примеры баз данных MS, таких как AdventureWorks или World Wide Importers, чтобы получить некоторые идеи.
Ответ №1:
Я предполагаю, что аренда, Еда, гигиена, развлечения имеют одинаковый тип столбца.
INSERT INTO Register
SELECT *
FROM
(SELECT SUM(a.rent_value) AS value,
'monthlyrent' AS TYPE
FROM Rent a
UNION SELECT SUM(b.food_value) AS value,
'monthlyfood' AS TYPE
FROM Food b) d pivot(max(value)
FOR TYPE IN (monthlyrent, monthlyfood)) piv;
Данные были развернуты для вставки в таблицу Register.
Вы можете поместить этот запрос в хранимую процедуру или просто запустить его вручную. Если вы хотите иметь обновленные данные в таблице Register, я предлагаю :
- Создайте хранимую процедуру, используя таблицу TRUNCATE for Register, за которой следует приведенный выше запрос
- Создайте задание SQL и запланируйте запуск хранимой процедуры в любое время, когда вам нужно.
Надеюсь, это поможет. Дайте мне знать, если вам понадобятся дополнительные сведения.
Ответ №2:
Вы должны разделять элементы в отдельные таблицы только при наличии веской причины. Для элементов, которые вы описываете, я не вижу веских причин.
Я бы представил структуру данных, подобную этой:
itemCategories
— содержит список категорий, которые вас интересуют, таких как «еда», «гигиена» и так далее.Purchases
— содержит каждую покупку с такими столбцами, какpurchaseDate
,location
,itemCategory
,description
и так далее.
Возможно, вам понадобятся дополнительные таблицы для других объектов, таких как «местоположение».
То, что вы называете Register
таблицей, тогда было бы просто запросом или представлением Purchases
.
Комментарии:
1. Мне нужно 8 таблиц, и это срочный проект. Это единственная причина, по которой у меня есть таблицы такими, какие они есть.
2. @DanielJaeger . . . Это одна из худших причин, которые я могу представить, для разбиения данных на таблицы. Вам нужно подумать о несколько более сложной модели данных для вашего проекта.