Я немного не понимаю, как это объяснить, поэтому я попытаюсь привести пример некоторых таблиц (+ данные), а затем результат, который мне нужен (все столбцы моей таблицы НЕ НУЛЕВЫЕ):
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(Quantity * UnitPrice)) из таблицы CampaignPayment, а BonusAmount — это суммированная сумма ( SUM(Amount) ) из таблицы BonusPayment. DateFrom и DateTo взяты из таблицы Payments.
Хитрость заключается в том, что для каждого клиента в течение данного месяца, где не охвачен каждый день этого месяца, мне нужна строка со следующими данными:
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.
РЕДАКТИРОВАТЬ: Также в качестве альтернативы допустимым решением является «пустая» строка для каждого клиента в месяц.