Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-统计查询中重复的帐户_Sql_Sql Server - Fatal编程技术网

SQL-统计查询中重复的帐户

SQL-统计查询中重复的帐户,sql,sql-server,Sql,Sql Server,我们的税务系统有一个sqlserver数据库,我正在统计数据,以查找不同支付类型的收入和数量。批量付款抵押贷款公司支付您的财产税,现金和支票付款是相当简单的。然而,在线和信用卡支付并不是那么容易获得统计数据。在线支付和信用卡支付都被放入一个bucket字段或CreditCardAmt列。当有人进行在线支付时,数据库会将支付显示为出纳员CTO_WEB,因此这对于计算正向支付非常有效。然而,如果由于任何原因,支付被撤销,那么CTO_WEB不是出纳员,它可能是CTOTSK等。这也会影响销售点信用卡统计

我们的税务系统有一个sqlserver数据库,我正在统计数据,以查找不同支付类型的收入和数量。批量付款抵押贷款公司支付您的财产税,现金和支票付款是相当简单的。然而,在线和信用卡支付并不是那么容易获得统计数据。在线支付和信用卡支付都被放入一个bucket字段或CreditCardAmt列。当有人进行在线支付时,数据库会将支付显示为出纳员CTO_WEB,因此这对于计算正向支付非常有效。然而,如果由于任何原因,支付被撤销,那么CTO_WEB不是出纳员,它可能是CTOTSK等。这也会影响销售点信用卡统计。因此,要计算销售点付款,您可以执行以下操作,如CreditCardAmt大于0和Teller!=CTO_网然后数一数。然而,被撤销的支付总是会是一个具有不同出纳员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);
这会给我这样的结果,这就是我想要的。然而,这些数据并不完全正确

以下是我正在进行统计的表视图:

以下是一个web支付被撤销的示例:


我的建议是将ReceiptNr添加到组中,并使用Row_编号确定其是否属于在线/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)可供排序。

示例数据和所需结果将大有帮助。是的,谢谢。我编辑了原始帖子,展示了我想要的结果,并添加了我正在使用的表格。