2016-05-09 52 views
0

我正在处理比较查询,该比较查询将比较不同信用卡类型处理的内容与我们的POS服务实际处理的内容。我遇到了一个问题,如果某些卡类型未在特定日期处理任何付款,但可能已退款,我不会看到某些类型的行。 IE:没有用VISA购买,但签发了VISA退款,但由于没有购买,该行不显示,即使该类型退款。显示0为空行

这里是我的查询:

WITH tran_total AS (
SELECT CONCAT(c.id_str, ' - ', c.clinic_str) AS Clinics, 
     t.clinic, 
     c.xcharge_mid, 
     p.pay_desc, 
     CAST(t.time_ran AS date) AS tran_date, 
     CASE WHEN SUM(t.amount) <> 0 THEN SUM(t.amount) * - 1 
     ELSE 0.00 END AS collection 
FROM dbo.transactions AS t INNER JOIN 
dbo.clinic_master AS c ON t.clinic = c.clinic INNER JOIN 
dbo.paytype AS p ON t.clinic = p.clinic AND t.paytype_id = p.paytype_id 
WHERE (t.time_ran > GETDATE() - 10) 
AND (t.paytype_id IS NOT NULL) 
AND (p.pay_desc = 'Visa' OR 
p.pay_desc = 'MasterCard' OR 
p.pay_desc = 'American Express' OR 
p.pay_desc = 'Discover') 
GROUP BY c.id_str, c.clinic_str, t.clinic, c.xcharge_mid, p.pay_desc, CAST(t.time_ran AS date)) 
SELECT w.Clinics, 
     w.pay_desc, 
     w.tran_date, 
     w.collection, 
     CASE WHEN w.pay_desc = 'Visa' THEN (SUM(VI_pur) - SUM(VI_ref)) 
     WHEN w.pay_desc = 'MasterCard' THEN (SUM(MC_pur) - SUM(MC_ref)) 
     WHEN w.pay_desc = 'American Express' THEN (SUM(AX_pur) - SUM(AX_ref)) 
     WHEN w.pay_desc = 'Discover' THEN (SUM(DI_pur) - SUM(DI_ref)) END AS xcharge 
FROM   tran_total AS w LEFT OUTER JOIN 
dbo.xcharge AS x ON w.xcharge_mid = x.xcharge_mid AND w.tran_date = x.settle_date 
GROUP BY w.Clinics, w.pay_desc, w.tran_date, w.collection 
ORDER BY w.Clinics, w.tran_date 

我想过围绕这种开关,并与来自xcharge表的比较开始,但没有一个pay_desc,可以轻松地连接这些如果事情被处理为错误的卡(选择了VISA,但发现扫描),那么我觉得行仍然会被遗漏。

我想要的是,即使SUM(t.amount)没有值,每个pay_desc都会出现在每个tran_date之间。我已经试过一个案例陈述来完成这个没有任何运气。

编辑:我觉得这个问题更多是由于t.time_ran变量。如果没有给定的pay_desc的支付,那么也不会有t.time_ran,有没有我可以做的函数来列出GETDATE() - 10和GETDATE()之间的某种东西,只需要t.time_ranx.settle_date是否匹配该变量?

对此有何看法?在此先感谢

UPDATE:

我创建了一个日历表,个别日期,并曾尝试以下查询:

WITH tran_test AS(
SELECT cal.calendardate AS cd, 
     p.clinic, 
     p.pay_desc, 
     p.paytype_id 
FROM calendar cal, paytype p 
WHERE cal.calendardate BETWEEN GETDATE()-10 AND GETDATE()+1 
AND (p.pay_desc = 'Visa' OR 
p.pay_desc = 'MasterCard' OR 
p.pay_desc = 'American Express' OR 
p.pay_desc = 'Discover')) 
SELECT w.cd, 
     CONCAT(c.id_str, ' - ', c.clinic_str) AS Clinics, 
     w.pay_desc, 
     ISNULL(SUM(t.amount)*-1, 0) AS collection, 
     CASE WHEN w.pay_desc = 'Visa' THEN (SUM(x.VI_pur) - SUM(x.VI_ref)) 
     WHEN w.pay_desc = 'MasterCard' THEN (SUM(x.MC_pur) - SUM(x.MC_ref)) 
     WHEN w.pay_desc = 'American Express' THEN (SUM(x.AX_pur) - SUM(x.AX_ref)) 
     WHEN w.pay_desc = 'Discover' THEN (SUM(x.DI_pur) - SUM(x.DI_ref)) END AS xcharge 
FROM tran_test w 
INNER JOIN clinic_master c 
    ON (w.clinic=c.clinic) 
LEFT OUTER JOIN transactions t 
    ON (t.clinic=w.clinic AND t.paytype_id=w.paytype_id AND CAST(t.time_ran AS date) = w.cd) 
LEFT OUTER JOIN xcharge x 
    ON (w.cd=x.settle_date AND c.xcharge_mid=x.xcharge_mid) 
GROUP BY w.cd, c.id_str, c.clinic_str, w.pay_desc 
ORDER BY w.cd 

然而,当我xcharge列似乎我没有得到一个问题乘以随机间隔,我不知道为什么。

+0

[SQL服务器:在查询中用0替换NULL]的可能重复(http://stackoverflow.com/questions/16840522/sql-server-replacing-null-with-0-in-a-query) – Laurel

+0

谢谢你的链接,但我已经尝试过'ISNULL(SUM(t.amount)* - 1,0)AS集合'以及不显示行 –

+0

的结果是'pay_desc' null? – Laurel

回答

1

这听起来像你需要的是一个日历表。您可以生成一个作为CTE的一部分(本网站上的许多示例或仅搜索Google),但IMO应该在数据库中包含一个持久表。这样,您就可以标记某些天为节假日,什么四分之一的企业认为他们在等

一旦你有一个表中的地方,你可以从该表从SELECT日期,然后LEFT OUTER JOIN到该表的Transactions表。在Transactions中没有匹配行的任何日期仍会显示为一行,但您的SUM的价值为0.00。

+0

这样的声音肯定会起作用,我会为当年的测试创建一个快速表格,并在结果通知后再生成其余部分。 –