2013-06-20 60 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 

我需要爲給定月份的所有客戶(兩種類型)顯示所有發票項目。結果應該包括Customer和Invoice表的所有列,InvoiceItemTP和InvoiceItemITS中的公共列,其中Description列是手動輸入的描述,如果它存在Description表的一般描述。 InvoiceItemITS和InvoiceItemTP是相互排斥的,並且有大約一半的列是相同的。我需要幫助將InvoiceItemITS和InvoiceItemTP中的公共列組合成一組列,並決定每行的描述。我怎樣才能做到這一點?

FYI:我不能添加或更改表或數據庫結構

+0

我需要顯示所有的發票項目...和...和...爲我做.. !! – user2407394

回答

1

LEFT JOIN兩個表中的列,然後使用CASEType從相應的表中選擇。以下是少數列的示例,您可以爲所需的所有列執行此操作。

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