2017-07-27 5 views
0

実際に私はプロジェクトで領収書用紙を作成していますが、現在の賢明な請求書の選択は解除されましたが、もう1つ疑いがあります。範囲内で1/6/17〜15/6/17のユーザー1の請求書を選択した場合、金額の合計は10,000ルピーと表示されます。今すぐuser1が5000を支払ったのですが、彼の2回目の支払い時にuser1に残高を表示する方法。選択した請求書の利用者に納付金額を表示

[注:User1はすでに1/6/17〜30/6/17に購入済みです。 ]

select 
    sum(TotalValue) bal 
from(
    select 
     ISNULL(sum(s.NetAmount),0) TotalValue 
    from Sales as s 
    where s.ConsumerID=56 
    and s.SaleDate='2017/06/10' 
    and s.SaleDate='2017/06/30' 

    union all 

    select - ISNULL(sum(s.Amount),0) TotalValue 
    from Receipt as s 
    where s.ConsumerID=56 
) n 

私のクエリには正確な出力が与えられていません。

私の出力を得るためにこのコードに書き直す方法。事前に

おかげで..私のSalesテーブルで

は、カラム(netamount)の合計を記録した値は36000 30/06/2017に2017年1月6日の間にあります。

今、最初の領収書です。したがって、最初にユーザーの請求額を確認します。このネストされたクエリを書き込むには、ユーザーが最初の10日間の金額を3回支払うことを選択します。例えば

1/6/17 - 量の最初の受信ユーザは15000では、2番目のエントリで5000

を支払っ10/6/17総量Iが取得値が10000であるが、クエリが31000

+0

こんにちは。私はそれを読むことができるように、そのクエリをフォーマットすることから始めなければなりませんでした。あなたがここで何をしようとしているのかはまったく明らかではありません。最初のクエリでは、s.SaleDateを持つ2つの述語があります。それは2017/06/30の行だけを返すので、最初のものを投稿したので、全く意味がありません。助けが必要な場合は、いくつかの詳細が必要です。ここから始めましょう。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+0

なぜネストされたクエリですか? – Eli

+0

あなたは何を得ているのか、何を得ることができるのでしょうか? – Eli

答えて

0
を返しますあなたは別の解決策は、

SELECT s.consumerid ,Isnull(Sum(s.netamount), 0) - Isnull(Sum(r.amount), 0) as balance 
FROM sales AS s 
left join receipt AS r 
on s.consumerid = r.consumerid 

     WHERE s.consumerid = 56 
       AND s.saledate >= '2017/06/10' 
       AND s.saledate <= '2017/06/30' 

ある

 ;WITH cte_sales 
    AS (SELECT s.consumerid 
       ,Isnull(Sum(s.netamount), 0) TotalSalesValue 
     FROM sales AS s 
     WHERE s.consumerid = 56 
       AND s.saledate >= '2017/06/10' 
       AND s.saledate <= '2017/06/30' 
     GROUP BY s.consumerid), 
    cte_recipt 
    AS (SELECT r.consumerid 
       ,Isnull(Sum(r.amount), 0) TotalReceiptValue 
     FROM receipt AS r 
     WHERE r.consumerid = 56 
     GROUP BY r.consumerid) 
SELECT a.consumerid 
     ,a.totalsalesvalue - Isnull(totalreceiptvalue, 0) balance 
FROM cte_sales a 
     LEFT JOIN cte_recipt b 
       ON a.consumerid = b.consumerid 
GROUP BY a.consumerid 

以下のSQLを試すことができます

どちらが優れたSQL実行計画を持っているかを判断する必要があります

+0

私を説明してください。なぜあなたはあなたの質問にwithコマンドを書くのですか? –

+0

私は2つの理由からcteテーブル(with)を使用しました。まず、私はあなたの作業ラインを壊したくありません。第二に、モデリング、インデックス構成、およびテーブルのサイズがわからない。しかし、あなたはこのクエリを使用することができます、簡単ですSELECT s.consumerid、 Isnull(Sum(s.netamount)、0) - Isnull(Sum(r.amount)、0)AS balance FROM sales AS LEFT JOIN領収書AS r ON s.consumerid = rです。消費者ID WHERE s.consumerid = 56 AND s.saledate> = '2017/06/10' AND s.saledate <= '2017/06/30' –

+0

oh。大丈夫だよ。あなたの説明のおかげで:) –

関連する問題