我们的税务系统有一个sqlserver数据库,我正在研究统计信息以查找不同付款类型的收入和计数(数量)。批量付款(抵押公司支付您的财产税),现金和支票付款非常简单。但是,在线和信用卡付款并不容易获得统计信息。在线支付和信用卡支付都被放入一个存储桶(字段或列)CreditCardAmt中。当有人进行在线支付时,数据库将支付显示为出纳员CTO_WEB,因此这对于计算正支付很有效。但是,如果由于任何原因导致付款被撤回,那么CTO_WEB可能不是出纳员,可能是CTOTSK等。这也使销售点信用卡统计数据无效。因此,要考虑销售点付款,您可以执行类似CreditCardAmt大于0和Teller的操作!= CTO_WEB然后计数。但是,撤消的付款始终是具有不同出纳员ID的人,因此在线和POS付款撤消会混杂在一起。
我认为,我可以解释的一种方法是使用收据编号(ReceiptNum)。我们的收据编号从每个纳税年度开始回溯到#1,因此我需要按纳税年度进行筛选。如果某人在线付款并且获得了收据号34(如果该付款被撤消了,则该行被撤消的行也将是收据号34)。因此,我需要一种方法来处理出纳员CTOWEB的付款,然后用另一种方式将其撤消柜员,但是收据编号相同。我还需要弄清楚如何从销售点付款的正数和冲销中区分该数量和收入。
这就是我现在所拥有的。我猜我将需要添加某种子查询来完成所有这些工作?
希望所有这些都是有道理的,感谢您的帮助。
SELECT
Year(PayDtTm) AS PayYear, Month(PayDtTm) AS PayMonth,
SUM(PaymentAmt) AS TotalRevenue,
SUM(CASE WHEN PaymentAmt < 0 THEN -1 ELSE 1 END) AS Volume,
SUM(CASE WHEN Teller = 'CTO_BTCH' THEN PaymentAmt ElSE 0 END) AS BatchRev,
SUM(CASE WHEN Teller = 'CTO_BTCH' THEN 1 ELSE 0 END) AS BatchVol,
SUM(CashAmt) AS CashRev,
SUM(CASE WHEN CashAmt < 0 THEN -1 WHEN CashAmt > 0 THEN 1 ELSE 0 END) AS VolCash,
SUM (CheckAmt) As CombinedCheckRev,
SUM (CASE WHEN CheckAmt < 0 THEN -1 WHEN CheckAmt > 0 THEN 1 ELSE 0 END) As CombinedVolCheck,
SUM(CreditCardAmt) AS CCRevenue,
SUM(CASE WHEN CreditCardAmt < 0 THEN -1 WHEN CreditCardAmt > 0 THEN 1 ELSE 0 END) As VolCC,
SUM(CASE WHEN Teller = 'CTO_WEB' THEN PaymentAmt ELSE 0 END) AS OnlineRev,
SUM(CASE WHEN Teller = 'CTO_WEB' AND PaymentAmt < 0 THEN -1 WHEN Teller = 'CTO_WEB' AND PaymentAmt > 0 THEN 1 END) As OnlineVol,
SUM(CASE WHEN Teller != 'CTO_WEB' AND CreditCardAmt > 0 THEN CreditCardAmt END) As POSRev,
SUM(CASE WHEN Teller != 'CTO_WEB' AND CreditCardAmt > 0 THEN 1 ELSE 0 END) As VolPOS
FROM [CTO].[dbo].[vReceiptMasterAdj]
WHERE PayDtTm >= '9/1/2019' and PayDtTm < '10/1/2019'
GROUP BY Year(PayDtTm), Month(PayDtTm)
ORDER BY Year(PayDtTm), Month(PayDtTm);
我的建议是将ReceiptNr添加到Group By中,并使用Row_Number()确定它是否属于Online / POS类别。
一个非常通用的示例是:
SELECT PayYear, PayMonth, ReceiptNum...
CASE WHEN MAX(CASE WHEN RowNr = 1 And Teller = 'CTO_WEB'
THEN 1 ELSE 0 END) = 1 THEN SUM(PaymentAmt) ELSE 0 END AS OnlineRev,
CASE WHEN MAX(CASE WHEN RowNr = 1 And Teller = 'CTO_WEB' THEN 1 ELSE 0 END) = 1
THEN SUM(CASE WHEN PaymentAmt < 0 THEN -1 WHEN PaymentAmt > 0 THEN 1 END) ELSE 0 END As OnlineVol,
CASE WHEN MAX(CASE WHEN RowNr = 1 And Teller = != 'CTO_WEB'
THEN 1 ELSE 0 END) = 1 THEN SUM(CreditCardAmt) ELSE 0 END As POSRev,
CASE WHEN MAX(CASE WHEN RowNr = 1 And Teller = != 'CTO_WEB'
THEN 1 ELSE 0 END) = 1 THEN SUM(CASE WHEN CreditCardAmt > 0 THEN 1 ELSE 0 END) ELSE 0 END As VolPOS
FROM
(
SELECT Year(PayDtTm) AS PayYear, Month(PayDtTm) AS PayMonth, ReceiptNum,
Row_Number() Over(Partition By Year(PayDtTm), Month(PayDtTm), ReceiptNum Order By RevenueID) AS RowNr,
PaymentAmt, Teller, etc...
FROM [CTO].[dbo].[vReceiptMasterAdj]
WHERE PayDtTm >= '9/1/2019' and PayDtTm < '10/1/2019'
) A
GROUP BY PayYear, PayMonth, ReceiptNum
ORDER BY PayYear, PayMonth
这个想法是测试第一行以确定它属于哪个类别,然后进行求和。假设您在原始记录中有某种主键字段(例如RevenueID)进行排序。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。