2017-07-31 138 views
-2

我想创建一个子查询来显示接受的交易和失败的事务的结果可以任何人指导我如何做到这一点? 这是我的查询结果:SQL子查询显示百分比

SELECT ah.MCH_Code,mch.MCH_Name,SUM(isnull(cast(RB.PurchasesPassed as decimal),0))+SUM(isnull(cast(RB.capturesPassed as decimal),0))  
    +SUM(isnull(cast(RB.voidPurchasePassed as decimal),0))+SUM(isnull(cast(RB.creditPassed as decimal),0)) 
    +SUM(isnull(cast(RB.voidCreditPassed as decimal),0))+SUM(isnull(cast(RB.voidCapturesPassed as decimal),0)) 
    +SUM(isnull(cast(RB.authPassed as decimal),0))+SUM(isnull(cast(RB.voidAuthPassed as decimal),0)) as 'Passed Transactions', 
    SUM(isnull(cast(RB.PurchasesFailed as decimal),0))+SUM(isnull(cast(RB.capturesFailed as decimal),0)) 
    +SUM(isnull(cast(RB.voidPurchaseFailed as decimal),0))+SUM(isnull(cast(RB.creditFailed as decimal),0)) 
    +SUM(isnull(cast(RB.voidCreditFailed as decimal),0))+SUM(isnull(cast(RB.voidCapturesFailed as decimal),0)) 
    +SUM(isnull(cast(RB.authFailed as decimal),0))+SUM(isnull(cast(RB.voidAuthFailed as decimal),0)) as 'Failed Transactions' 
    FROM PSP.dbo.MCH_AccountHolder AH 
    LEFT OUTER JOIN [PSP].[dbo].[RECBUILD] RB ON rb.merchantId = ah.MCH_Code 
    LEFT OUTER JOIN PSP.dbo.USERS U on ah.UserId = u.USER_ID 
    LEFT OUTER JOIN PSP.dbo.MERCHANTS mch ON mch.MCH_Code = ah.MCH_Code 
    where u.USER_ID = '14655' 
    Group by ah.MCH_Code, u.USER_NAME,mch.MCH_Name 
+0

您的问题被标记为MySQL,但代码看起来像SQL Server。 –

+0

请提供样品数据(DDL + DML)和预期结果。 –

+0

向我们展示数据库模式,样本数据和预期输出。 \t请阅读[**如何提问**](http://stackoverflow.com/help/how-to-ask) \t \t这里是一个伟大的地方[** START **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)来了解如何提高您的问题质量并获得更好的答案。 \t [**如何创建一个最小,完整和可验证示例**](http://stackoverflow.com/help/mcve) \t尝试在http://rextester.com中创建示例 –

回答

1

这是怎么回事?通过将原始查询转换为CTE(基本上是一个已被移出主查询结构以提高可读性的子查询),可以很容易地在其他表达式中使用您的计算值。这将输出相同的行集,但将结果中包含的所有事务的已传递事务处理的百分比。

;With Totals as 
(
SELECT ah.MCH_Code,mch.MCH_Name,SUM(isnull(cast(RB.PurchasesPassed as decimal),0))+SUM(isnull(cast(RB.capturesPassed as decimal),0))  
    +SUM(isnull(cast(RB.voidPurchasePassed as decimal),0))+SUM(isnull(cast(RB.creditPassed as decimal),0)) 
    +SUM(isnull(cast(RB.voidCreditPassed as decimal),0))+SUM(isnull(cast(RB.voidCapturesPassed as decimal),0)) 
    +SUM(isnull(cast(RB.authPassed as decimal),0))+SUM(isnull(cast(RB.voidAuthPassed as decimal),0)) as 'Passed Transactions', 
    SUM(isnull(cast(RB.PurchasesFailed as decimal),0))+SUM(isnull(cast(RB.capturesFailed as decimal),0)) 
    +SUM(isnull(cast(RB.voidPurchaseFailed as decimal),0))+SUM(isnull(cast(RB.creditFailed as decimal),0)) 
    +SUM(isnull(cast(RB.voidCreditFailed as decimal),0))+SUM(isnull(cast(RB.voidCapturesFailed as decimal),0)) 
    +SUM(isnull(cast(RB.authFailed as decimal),0))+SUM(isnull(cast(RB.voidAuthFailed as decimal),0)) as 'Failed Transactions' 
    FROM PSP.dbo.MCH_AccountHolder AH 
    LEFT OUTER JOIN [PSP].[dbo].[RECBUILD] RB ON rb.merchantId = ah.MCH_Code 
    LEFT OUTER JOIN PSP.dbo.USERS U on ah.UserId = u.USER_ID 
    LEFT OUTER JOIN PSP.dbo.MERCHANTS mch ON mch.MCH_Code = ah.MCH_Code 
    where u.USER_ID = '14655' 
    Group by ah.MCH_Code, u.USER_NAME,mch.MCH_Name 
) 

SELECT *, Passed Transactions/(Passed Transactions + Failed Transactions) as PctPassed 
FROM Totals