Расширенный (?) SQL присоединяется? - PullRequest
1 голос
/ 24 мая 2009

Я немного растерялся относительно того, как это объяснить, поэтому я попытаюсь привести пример некоторых таблиц (+ данные), а затем результат, к которому я стремлюсь (все мои столбцы таблицы НЕ НУЛЬЫ):

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.

РЕДАКТИРОВАТЬ: Кроме того, в качестве альтернативы «пустая» строка для каждого клиента в месяц также является и приемлемым решением.

1 Ответ

1 голос
/ 24 мая 2009

Я бы сделал вспомогательную таблицу с «каждым днем ​​этого месяца», чтобы упростить определение, «не охвачен ли каждый день месяца» (несколько двусмысленная спецификация, но вспомогательная таблица должна помочь, если вы имеете в виду » ни один день не покрыт "или" некоторые дни не покрыты "и считается ли день" покрытым ", если он имеет или бонус или статистику, или если ему необходимо иметь оба чтобы считаться «покрытым» - эти двусмысленности, поэтому я не собираюсь даже пытаться набросать SQL с помощью этой вспомогательной таблицы ;-). Тогда я бы UNION "пустые строки" с "начальным битом", который вы уже знаете, как это сделать - кажется идеальной задачей для UNION! -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...