2012-05-11 18 views
2

誰かが3つのテーブルから総手数料を計算するための手続き書を作成する手助けをしてくれますか?ここで自分のデータと一緒にテーブル..合計手数料を計算するためのSQLプロシージャの作成方法

はTABLE_1

accountno shipername shiperaddress Executivename 
    001  john   123, London   Paul 
    002  Robi   127, China   Soma 

Table_2

Executivename shipername shiperaddress accountno currentamount anotheramount  
    paul   john  123,london  001   10500  12000 
    soma   robi  127,china  002   11000  6800 

Table_3

accountno Date  ReceivedAmount MoneyReceiptNo 
    001  1/1/2012  6500    G 256412 
    002  1/2/2012  5200    D 246521 
です0

ここで私は、合計会費は、私は次のストアドプロシージャでそれを実行しようとしました

(currentamount + anotheramount) - receivedamount 

として計算されることを言及しています。

CREATE PROCEDURE [dbo].[rptexetotaldues] @Executivename varchar(20) 
AS BEGIN 
    select 
     table_1.Executivename, 
     sum(table_2.currentamount + table_2.anotheramount 
      - table_3.receivedamount) as TotalDues 
    from 
     table_1 
    full join 
     table_2 on table_1.accountno = table_2.accountno 
    join 
     table_3 on table_3.accountno = table_1.accountno 
    where 
     table_1.Executivename = @Executivename 
    group by 
     table_1.Executivename 
end 

しかし、これは機能しません。誰か助けてください。

+1

**( '2と荷主p ') - そしてまた:あなたは' Table_1'のために何が必要ですか? 'Table_2'には、' Table_1'に格納されているものと同じ情報がすべて含まれています。正規化されたものではありません。 –

+0

どうしたら失敗しますか?これは文法上の問題か計算上の問題ですか? –

+0

これは私が思う計算問題です。レポートは、エグゼクティブname.TotalDuesだけが空白を生成します。 – Joy

答えて

0

私は2つの問題を考えることができます。まず、口座番号が表1または表2のいずれかに複製されていることです。これにより、余分な行が追加されます。

テーブル3にテーブル2にない行があるということです。これは、値の1つがNULLであるため、合計内の加算がNULLであることを意味します。あなたはこれらのいずれかの方法でこの問題を解決することができます

sum(table_2.currentamount) + sum(table_2.anotheramount) - sum(table_3.receivedamount) 

または

sum(coalesce(table_2.currentamount, 0.0) + coalesce(table_2.anotheramount, 0.0) - coalesce(table_3.receivedamount, 0.0)) as TotalDues 
2

あなたのサンプルは私のために働きました。私が変えた唯一の事は、 "Date"です。カラム名として "Date"を避けることを強くお勧めします。私もエイリアシングを少し変えましたが、それは大丈夫だったはずです。私は@Gordon Linoffが正しいと思います - あなたはNULLSに問題があります。ここで

DECLARE @table_1 TABLE (accountno char(5), shipername char(20), shiperaddress char(40), Executivename varchar(20)) 
INSERT INTO @table_1 VALUES ('001', 'john', '123, London', 'Paul') 
INSERT INTO @table_1 VALUES ('002','Robi','127, China','Soma') 

DECLARE @table_2 TABLE (Executivename varchar(20), shipername char(20), shiperaddress char(40), 
         accountno char(20), currentamount decimal(10,2), anotheramount decimal(10,2)) 

INSERT INTO @table_2 VALUES ('paul', 'john','123,london','001',10500, 12000) 
INSERT INTO @table_2 VALUES ('soma', 'robi', '127,china', '002', 11000, 6800) 

DECLARE @table_3 TABLE(accountno char(20), tranDate datetime, ReceivedAmount decimal(10,2), MoneyReceiptNo char(10)) 
INSERT INTO @table_3 VALUES ('001', '1/1/2012', 6500, 'G 256412') 
INSERT INTO @table_3 VALUES ('002', '1/2/2012', 5200,'D 246521') 


DECLARE @Executivename varchar(20) 

--SET @Executivename = 'Paul' 
SET @Executivename = 'Soma' 

    select 
     tb1.Executivename, 
     sum(tb2.currentamount + tb2.anotheramount - tb3.receivedamount) as TotalDues 
    from 
     @table_1 tb1 
     full join @table_2 tb2 on tb1.accountno = tb2.accountno 
     join @table_3 tb3 on tb3.accountno = tb1.accountno 
    where 
     [email protected] group by tb1.Executivename 

は私の結果は以下のとおりです。

Executivename TotalDues 
Soma 12600.00 
+0

あなたのreply.butに1人以上のエグゼクティブがいる場合、それは完璧に働くでしょうか? executivename = soma、accountno = 003、shipername = XYZ、shiperaddress =バングラデシュ、currentamount = 12000、anotheramount = 8000、およびtable_3、receivedamount = 5000.soaのTotalDues =の別のクライアントについて考えてみましょう。私は問題を抱えている。結果は正しく生成されていない。私はなぜこれが起こっているのか理解していない??? – Joy

0

私は以下の例、それはUNIONクエリとしてより簡単になると思います:それは

CREATE PROCEDURE [dbo].[rptexetotaldues] @Executivename varchar(20) 
AS BEGIN 

SELECT SUB.ACCOUNTNO, SUM(SUB.DUE) AS TOTALDUE FROM 
    (SELECT ACCOUNTNO 
     , CURRENTAMOUNT AS DUE 
    FROM TABLE_2 
    INNER JOIN TABLE_1 -- WILL ONLY WORK IF ACCOUNTNO IS UNIQUE WITHIN TABLE_1 
    ON TABLE_1.ACCOUNTNO = TABLE2.ACCOUNTNO 
    WHERE TABLE_1.EXECUTIVENAME = @Executivename 

    UNION ALL 

    SELECT ACCOUNTNO 
     , ANOTHERAMOUNT AS DUE 
    FROM TABLE_2 
    INNER JOIN TABLE_1 
    ON TABLE_1.ACCOUNTNO = TABLE2.ACCOUNTNO 
    WHERE TABLE_1.EXECUTIVENAME = @Executivename 

    UNION ALL 

    SELECT ACCOUNTNO 
     , -RECEIVEDAMOUNT AS DUE -- NOTE NEGATIVE SIGN 
    FROM TABLE 3 
    INNER JOIN TABLE_1 
    ON TABLE_1.ACCOUNTNO = TABLE3.ACCOUNTNO 
    WHERE TABLE_1.EXECUTIVENAME = @Executivename 
    ) SUB 

GROUP BY SUB.ACC 
+0

多くの多くのありがとう。私はこれを試してみます – Joy

+0

あなたの助けによって多くのbendataclearに感謝し、私は結果を得ることができます。しかし、毎日、月ごとのレポートと、現在の金額、年齢、受取金額に関するヘルプが必要です。人々の残りの部分は、この点で私を助けてください。 – Joy

+0

これは新しい問題として投稿するだけでこの問題に関連していない場合。 – bendataclear

関連する問題