微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

查看查询而无需子选择T-SQL

如何解决查看查询而无需子选择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 举报,一经查实,本站将立刻删除。