我有一个数据库,以下列方式存储客户的发票信息
客户 - 存储客户信息
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中的公共列组合成一组列并确定每行的描述。我怎样才能做到这一点?
仅供参考:我无法在表格或数据库结构中添加或更改列
答案 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