0

2つの値を格納するテーブルがあります。各顧客の「合計」と「未払い」。データは2つのファイルを使用してテーブルにアップロードされます。1つは「total」を取り込み、もう1つは「owing」を取り込みます。これは、customerIDごとに2つのレコードがあることを意味します。

customerID:--------Total:--------- Owing:

1234----------------  1000----------NULL

1234-----------------NULL-----------200

2つのレコードをマージするストアドプロシージャを作成したいと思います。

customerID:--------Total:--------- Owing:

1234----------------  1000----------200

COALESCEを使用した例を見たので、次のようにまとめます。

BEGIN

-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

--Variable declarations

DECLARE @customer_id varchar(20)
DECLARE @total decimal(15,8)
DECLARE @owing decimal(15,8)
DECLARE @customer_name_date varchar(255)
DECLARE @organisation varchar(4)
DECLARE @country_code varchar(2)
DECLARE @created_date datetime

--Other Variables
DECLARE @totals_staging_id int

--Get the id of the first row in the staging table
SELECT @totals_staging_id = MIN(totals_staging_id)
from TOTALS_STAGING

--iterate through the staging table
WHILE @totals_staging_id is not null
BEGIN

update TOTALS_STAGING

SET 
total = coalesce(@total, total),
owing = coalesce(@owing, owing)

where totals_staging_id = @totals_staging_id

END
END

何か案は?

4

4 に答える 4

1
SELECT t1.customerId, t1.total, t2.owing FROM test t1 JOIN test t2 ON ( t1.customerId = t2.customerId) WHERE t1.total IS NOT NULL AND t2.owing IS NOT NULL

UPDATE2 番目のファイル実行で使用しないのはなぜですか?

于 2013-02-20T12:15:45.827 に答える
0

これを試して :

CREATE TABLE #Temp
(
  CustomerId int,
  Total int,
  Owing int
)

insert into #Temp
values (1024,100,null),(1024,null,200),(1025,10,null)



Create Table #Final 
(
  CustomerId int,
  Total int,
  Owing int
)

insert into #Final
values (1025,100,50)



MERGE #Final AS F
USING 
(SELECT customerid,sum(Total) Total,sum(owing) owing FROM #Temp
 group by #Temp.customerid
) AS a

ON (F.customerid = a.customerid)
WHEN MATCHED THEN UPDATE SET F.Total = F.Total + isnull(a.Total,0)
                              ,F.Owing = F.Owing + isnull(a.Owing,0)
WHEN NOT MATCHED THEN
INSERT (CustomerId,Total,Owing)
VALUES (a.customerid,a.Total,a.owing);

select * from #Final

drop table #Temp
drop table #Final
于 2013-02-20T11:04:09.553 に答える
0

これはうまくいくはずです:

SELECT CustomerID, 
       COALESCE(total1, total2) AS Total, 
       COALESCE(owing1, owing2) AS Owing
FROM 
(SELECT row1.CustomerID AS CustomerID,
        row1.Total AS total1,
        row2.Total AS total2,
        row1.Owing AS owing1,
        row2.Owing AS owing2
FROM YourTable row1 INNER JOIN YourTable row2 ON row1.CustomerID = row2.CustomerID
WHERE row1.Total IS NULL AND row2.Total IS NOT NULL) temp
--Note:  Alter the WHERE clause as necessary to ensure row1 and row2 are unique.

...ただし、row1 と row2 が一意であることを確認するためのメカニズムが必要になることに注意してください。私のWHERE句は、あなたが提供したデータに基づく例です。ビジネス ルールにより具体的なものを追加するには、これを微調整する必要があります。

于 2013-07-20T22:04:49.933 に答える
0

COUNT を除き、集計関数は null 値を無視します。集計関数は、SELECT ステートメントの GROUP BY 句で頻繁に使用されます。MSDN

したがって、合計で null 値について心配する必要はありません。以下は、 マージレコードを一緒に提供します。フィドルデモ

select customerId,
       sum(Total) Total,
       sum(Owing) Owing
from T
Group by customerId
于 2013-02-20T10:37:24.007 に答える