2013-06-20 2 views
1

У меня есть база данных, которая хранит информацию счетов клиентов в следующей модеОбъединения общих столбцов в двух таблицах в одном набор столбцов

клиенты - магазины информация о клиенте

ID 
Name 
Address 
Type --ITS/TP 

счет-фактуре - магазины детали счета для клиентов

ID 
Month 
CustomerID 
Total Amount 

InvoiceItemITS - магазины деталь пункта счета для своих клиентов

ID 
InvoiceID 
DescriptionID 
Price 
Volume 
Amount 
Description –- Non generic descriptions manually entered 
Pipeline 

InvocieItemTP - Магазины счета-фактура товара для клиентов TP

ID 
InvoiceID 
DescriptionID 
Price 
Volume 
Amount 
Transaction 
Start date 
End date 

Описания - магазины общего счет-фактура пункт описание

ID 
Name 

Мне нужно отобразить все счета-фактуры для всех клиентов (оба типа) для данного месяца. Результат должен включать все столбцы таблиц «Клиент» и «Счет-фактура» и общие столбцы в InvoiceItemTP и InvoiceItemITS, а столбец «Описание» - это введенное вручную описание, если оно существует иначе, общее описание для таблицы «Описание». InvoiceItemITS и InvoiceItemTP являются взаимоисключающими и имеют около половины общих столбцов. Мне нужна помощь в расчете общих столбцов в InvoiceItemITS и InvoiceItemTP в один набор столбцов и выбор описания для каждой строки. Как я могу это сделать?

FYI: Я не могу добавить или изменить столбцы в таблицах или структуру базы данных

+0

Мне нужно отобразить все счета-фактуры ... и ... и сделать это для меня .. !! – user2407394

ответ

1

You LEFT JOIN обе таблицы, а затем использовать CASE на Type, чтобы выбрать из соответствующей таблицы. Вот пример для нескольких столбцов, вы можете сделать это для всех столбцов, которые вам нужны.

SELECT 
    c.ID 
    ,c.Name 
    ,c.Type 
    ,i.Month 
    ,i.[Total Amount] 
    ,CASE WHEN c.Type = 'ITS' THEN its.Price ELSE tp.Price END AS Price --construct for common columns 
    ,CASE c.Type WHEN 'ITS' THEN its.Volume 
       WHEN 'TP' THEN tp.Volume 
       ELSE NULL 
    END AS Volume -- or something like this 
    ,CASE WHEN c.Type = 'ITS' THEN COALESCE(its.Description, dits.Name) 
     ELSE dtp.Name 
    END AS Description -- this for description 
FROM Customer c 
LEFT JOIN Invoice in ON in.CustomerID = c.ID 
LEFT JOIN InvoiceItemITS its ON its.InvoiceID = in.ID 
LEFT JOIN InvocieItemTP tp ON tp.InvoiceID = in.ID 
LEFT JOIN [Description] dtp ON dtp .ID = tp.DescriptionID 
LEFT JOIN [Description] dits ON dits.ID = its.DescriptionID