Я немного растерялся относительно того, как это объяснить, поэтому я попытаюсь привести пример некоторых таблиц (+ данные), а затем результат, к которому я стремлюсь (все мои столбцы таблицы НЕ НУЛЬЫ):
Table: Customers
Id int primary key
Name varchar(250)
Table: Stats (Date, CustomerId is the primary key)
Date (date)
CustomerId (int) - foreign key to Customers table
Earning (money)
Table: Bonus
Id int primary key
CustomerId int - foreign key to Customers table
Date date
Amount money
Table: Payments
Id int primary key
DateFrom date,
DateTo date,
CustomerId bigint - foreign key to Customers table
Table: CampaignPayment
Id int primary key
PaymentId int - foreign key to payments table
Quantity int
UnitPrice money
Table: BonusPayment
Id int primary key
PaymentId int - foreign key to payments table
Amount money
Идея в том, что каждый раз, когда клиент делает что-то, что должно заработать ему деньги, он попадает в таблицу статистики. Клиенты также могут получать различные виды бонусов, которые входят в таблицу бонусов. Время от времени мне нужно создавать счет-фактуру для клиентов (таблица платежей), в которой будет перечисляться материал из таблицы статистики + таблицы бонусов за указанный период времени, и который будет генерировать счет (то есть таблица платежей определяет, кто является счетом) для какого периода и в таблицах кампаний и бонусов определяется, что и почему выплачивается).
Теперь - мне нужно иметь возможность объединить все эти таблицы, чтобы получить вывод следующего:
CustomerId | CustomerName | PaymentId | Amount | BonusAmount | DateFrom | DateTo
Сумма - это сумма сумм (SUM (Количество * UnitPrice)) из таблицы CampaignPayment, а BonusAmount - сумма сумм (SUM (Amount)) из таблицы BonusPayment. DateFrom и DateTo из таблицы платежей.
Хитрость заключается в том, что для каждого клиента в данном месяце, где каждый день этого месяца не охватывается, я хочу строку со следующими данными:
CustomerId | CustomerName | NULL | (Stats.Earning - Amount Earned from possible payments within the month) | (Bonus.Amount - Amount Earned possible bonuses that is in payments within the month) | First day of month | Last day of month
Мне может потребоваться немного более сложная логика в отношении того, как рассчитать сумму и сумму бонуса в этих «пустых» строках, но на данный момент это то, что мне нужно для начала.
Как бы я поступил об этом? Я знаю, как сделать «начальный» бит, но как мне добавить эти «пустые» строки? Я надеюсь, что я достаточно подробно объяснил проблему, и вы можете увидеть эту идею здесь - если нет, дайте мне знать, и я постараюсь объяснить дальше.
База данных MS SQL Server 2008.
РЕДАКТИРОВАТЬ: Кроме того, в качестве альтернативы «пустая» строка для каждого клиента в месяц также является и приемлемым решением.