1

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

客户- 存储客户信息

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

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

4

1 回答 1

1

LEFT JOIN两个表,然后使用CASEonType从适当的表中进行选择。这是几列的示例,您可以为所需的所有列执行此操作。

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
于 2013-06-20T22:32:06.550 回答