将两个表中的公共列合并为一组列

时间:2013-06-20 22:13:51

标签: sql sql-server sql-server-2008 join union

我有一个数据库,以下列方式存储客户的发票信息

客户 - 存储客户信息

ID
Name
Address
Type --ITS/TP

发票 - 存储客户的发票明细

ID
Month
CustomerID
Total Amount

InvoiceItemITS - 存储ITS客户的发票项目详细信息

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列是手动输入的描述(如果它还存在描述表的通用描述)。 InvoiceItemITS和InvoiceItemTP是互斥的,共有大约一半的列。我需要帮助将InvoiceItemITS和InvoiceItemTP中的公共列组合成一组列并确定每行的描述。我怎样才能做到这一点?

仅供参考:我无法在表格或数据库结构中添加或更改列

1 个答案:

答案 0 :(得分:1)

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