2016-05-09 8 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が選択されていますが、Discoverがスキャンされます)。

SUM(t.amount)に値が設定されていない場合でも、それぞれはすべてtran_dateに表示されます。私は幸運なしにこれを達成するためにケースステートメントを試みました。

編集:私は問題がt.time_ran変数のためにあると感じています。 pay_descの支払いがない場合は、t.time_ranも存在しません。GETDATE() - 10 AND GETDATE()の間の日付をリストする機能はありますか?t.time_ran代わりにその変数に一致するのはx.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サーバー:クエリでNULLを0に置き換える]の可能な複製(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'ヌルですか? – Laurel

答えて

1

カレンダーテーブルが必要なように聞こえます。 CTEの一部として1つを生成することができます(このサイトの多くの例またはGoogle検索のみ)が、IMOではデータベースに永続表が必要です。このようにして、特定の日を銀行休業日、ビジネスの四半期などと記入することができます。

このテーブルを取得したら、 Transactionsテーブル。 Transactionsの行が一致しない日付は、行が表示されますが、SUMの値は0.00になります。

+0

それは間違いなく動作するようなサウンドです。今年はテスト用のクイックテーブルを作成し、残りの部分を生成して結果を通知します。 –

関連する問題