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

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