2

3つのテーブルから合計会費を計算するための作成手順ステートメントを表示することで誰かが私を助けることができますか?ここにそれらのデータと一緒に表があります..

表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

ここで、合計会費は次のように計算されます。

(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

しかし、それはうまくいきません。誰か助けてください。

4

3 に答える 3

2

あなたのサンプルは私のために働いた。私が変更したのは、「日付」を翻訳することだけです。列名として「日付」を避けることを強くお勧めします。エイリアシングも少し変更しましたが、大丈夫だったはずです。@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 
        tb1.Executivename=@Executivename group by tb1.Executivename

ここに私の結果があります:

Executivename   TotalDues
Soma    12600.00
于 2012-05-11T21:25:11.317 に答える
0

2つの問題が考えられます。1 つ目は、テーブル 1 またはテーブル 2 でアカウント番号が重複していることです。これにより、余分な行が追加されます。

2 つ目は、テーブル 2 にない行がテーブル 3 にあるということです。これは、値の 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 
于 2012-05-11T21:15:52.097 に答える
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
于 2012-05-11T21:26:04.937 に答える