如何解决查看查询而无需子选择T-SQL
所以我试图建立一个视图查询,但是我一直使用仅联接失败,因此最终导致这种变形。.关于如何编写此查询的任何提示,因此我不必使用6个子选择? FeeSum和PaymentSum可以为null,因此理想情况下,我不要结果集中的那些,而且我也不希望FeeSum和PaymentSum相等的结果。
快速注释:客户是存储客户信息(名称,地址等)的表。 客户在客户端上有一个fk,它是客户端的外壳表,用于存储客户端的更多信息, 付款是客户进行的所有付款的清单, 订单是客户完成的所有订单的列表。
目标是获得一个列表,在该列表中,我们可以根据订单跟踪要支付哪些客户的未结费用。这是一个遗留项目,所以不要问为什么人们在付款前可以订购:)
SELECT
cu.Id as [CustomerId],CASE
WHEN cl.IsPerson = 1
THEN cl.[AdditionalName] + ' ' + cl.[Name]
ELSE cl.AdditionalName
END as [Name],cl.CustomerNumber,(SELECT SUM(o.Fee) FROM [publication].[Order] o WHERE o.[State] = 2 AND o.CustomerId = cu.Id) as [FeeSum],(SELECT SUM(p.Amount) FROM [publication].[Payment] p WHERE p.CustomerId = cu.Id) as [PaymentSum],(SELECT MAX(o.OrderDate) FROM [publication].[Order] o WHERE o.[State] = 2 AND o.CustomerId = cu.Id) as [LastOrderDate],(SELECT MAX(p.PaymentDate) FROM [publication].[Payment] p WHERE p.CustomerId = cu.Id) as [LastPaymentDate],(SELECT MAX(f.Created) FROM [client].[File] f WHERE f.TemplateName = 'Reminder' AND f.ClientId = cl.Id) as [LastReminderDate],(SELECT MAX(f.Created) FROM [client].[File] f WHERE f.TemplateName = 'Warning' AND f.ClientId = cl.Id) as [LastWarningDate]
FROM
[publication].[Customer] cu
JOIN
[client].[Client] cl
ON cl.Id = cu.ClientId
WHERE
cu.[Type] = 0
预先感谢,希望我没有做错任何事情。
亲切的问候
解决方法
您可以重写相关子查询以改为使用联接:
SELECT
cu.Id AS [CustomerId],CASE WHEN cl.IsPerson = 1
THEN cl.[AdditionalName] + ' ' + cl.[Name]
ELSE cl.AdditionalName END AS [Name],cl.CustomerNumber,o.FeeSum,p.PaymentSum,o.LastOrderDate,p.LastPaymentDate,f.LastReminderDate,f.LastWarningDate
FROM [publication].[Customer] cu
INNER JOIN [client].[Client] cl
ON cl.Id = cu.ClientId
INNER JOIN
(
SELECT CustomerId,SUM(Fee) AS [FeeSum],MAX(OrderDate) AS [LastOrderDate]
FROM [publication].[Order]
WHERE o.[State] = 2
GROUP BY CustomerId
) o
ON o.CustomerId = cu.Id
INNER JOIN
(
SELECT CustomerId,SUM(Amount) AS [PaymentSum],MAX(PaymentDate) AS [LastPaymentDate]
FROM [publication].[Payment]
WHERE o.[State] = 2
GROUP BY CustomerId
) p
ON p.CustomerId = cu.Id
INNER JOIN
(
SELECT ClientId,MAX(CASE WHEN TemplateName = 'Reminder' THEN Created END) AS [LastReminderDate],MAX(CASE WHEN TemplateName = 'Warning' THEN Created END) AS [LastWarningDate]
FROM [client].[File]
GROUP BY ClientId
) f
ON f.ClientId = cl.Id
WHERE
cu.[Type] = 0;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。