0

以下は、私が SQL Server 2012 でやろうとしていることです。各 AMT 値が表 1 の合計に対する合計の % で表 2 を更新したいのですが、% を取得するための分母は、同じ MasterDept を持つ行。この SELECT クエリを使用して、MasterDept が 1 つしかないテーブルをロードするときに正しいパーセンテージを取得できますが、MasterDept が複数ある場合はその方法がわかりません。各テーブルの最初の 2 列は、列内の構造とデータの両方が同じです。

SELECT ABCID,
     [AMT%] = ClientSpreadData.AMT/CONVERT(DECIMAL(16,4),(SELECT SUM(ClientSpreadData.AMT) 
     FROM ClientSpreadData))
FROM ClientSpreadData

表データ

TABLE 1 (MasterDept varchar(4), ABCID varchar(20), AMT INT)
Sample Data (4700, 1, 25),
            (4300, 2, 30),
            (4700, 3, 50),
            (4300, 4, 15)

TABLE 2 (MasterDept varchar(4), ABCID varchar(20), [AMT%] INT)
Sample Data (4700, 1, AMT%)

AMT% は AMT / SUM(AMT) と等しくなければなりません。SUM(AMT) は、表 1 の MasterDept が表 2 のレコードの MasterDept と一致する値のみを合計する必要があります。

それは理にかなっていますか?

4

1 に答える 1

0

ウィンドウを使用して、分割された を取得できますSUM()

SELECT MasterDept, ABCID, AMT, SUM(AMT) OVER(PARTITION BY MasterDept)
FROM #Table1

これを使用して、各行のパーセンテージを取得して 2 番目のテーブルを更新できます (これは、MasterDept/ABCID の組み合わせごとに 1 行を想定しています)。

UPDATE A
SET A.[AMT%] = B.[AMT%]
FROM Table2 A
JOIN (SELECT MasterDept
           , ABCID
           , AMT
           , CASE WHEN SUM(AMT) OVER(PARTITION BY MasterDept) = 0 THEN 0
                  ELSE AMT*1.0/SUM(AMT) OVER(PARTITION BY MasterDept)
             END 'AMT%'
      FROM #Table1
      ) B 
    ON A.MasterDept = B.MasterDept
    AND A.ABCID = B.ABCID

サブクエリでわかるように、合計の割合を Table1 に追加できます。そのため、Table2 は少し冗長なので必要ないかもしれません。

更新:CASEステートメントを使用してSUM()0 を処理できます。

于 2013-07-25T17:49:59.070 に答える