1

私のデータセットは次のようになります。

COLA  | COLB
Name1 | 218
Name2 | 157
Name3 | 134
Name4 | 121

この出力が必要です:

COLA  | COLB| COLC
Name1 | 218 | 0.34
Name2 | 157 | 0.60
Name3 | 134 | 0.71
Name4 | 121 | 1

これまでのところ、私のSQLは次のようになっています。

SELECT COLA, COLB, COLB/SUM(COLB) FROM #MyTempTable

このSQLに関する2つの問題。1つは、COLCは毎回0であり、私にはわかりません。2つ目は、結果が%になったとしても、累積%ではないということです。

StackOverflowで同様のスレッドをいくつか見ましたが、それらのスレッドからの回答を正確なシナリオで機能させることができませんでした。

提案を事前に感謝します!

4

3 に答える 3

4

計算例は少しずれているかもしれませんが、あなたはこのようなものを探していると思います。

SELECT
    COLA,
    COLB,
    ROUND(
        -- Divide the running total...
        (SELECT CAST(SUM(COLB) AS FLOAT) FROM #MyTempTable WHERE COLA <= a.COLA) /
        -- ...by the full total
        (SELECT CAST(SUM(COLB) AS FLOAT) FROM #MyTempTable),
        2
    ) AS COLC
FROM #MyTempTable AS a
ORDER BY COLA

編集:丸めを追加しました。

これにより、次の出力が得られます。

COLA    COLB    COLC
Name1   218     0.35
Name2   157     0.6
Name3   134     0.81
Name4   121     1

結果が0(または1)である理由は、intをintで除算しているため、intが得られるためです(データ型の優先順位を参照)。

アップデート:

これは「三角結合」を使用して現在の合計()を取得することを追加する必要がありWHERE COLA <= a.COLAます。SQL Serverのバージョンによっては、パフォーマンスが問題になる場合は、これを他のオプションと比較できます。

于 2012-08-28T14:06:11.153 に答える
1

OLAP関数を使用しない場合は、テーブルで奇妙な自己結合を行う必要があります。

SELECT a.ColA, a.ColB, SUM(b.ColB) AS ColX
  FROM #MyTempTable AS a
  JOIN #MyTempTable AS b
    ON a.ColA <= b.ColA
 GROUP BY a.ColA, a.ColB

これにより、生の累積SUMが得られます。答えを取得するためのサブクエリとして間違いなくそれを使用できます。パーセンテージを取得するには、累積合計を総合計で割る必要があることに注意してください。

SELECT ColA, ColB, ColX / (SELECT SUM(ColB) FROM MyTempTable) AS ColC
  FROM (SELECT a.ColA, a.ColB, SUM(b.ColB) AS ColX
          FROM #MyTempTable AS a
          JOIN #MyTempTable AS b
            ON a.ColA <= b.ColA
         GROUP BY a.ColA, a.ColB
       ) AS X
 ORDER BY ColA

あなたはただ書くことができるかもしれません:

SELECT a.ColA, a.ColB, SUM(b.ColB) / (SELECT SUM(ColB) FROM MyTempTable) AS ColC
  FROM #MyTempTable AS a
  JOIN #MyTempTable AS b
    ON a.ColA <= b.ColA
 GROUP BY a.ColA, a.ColB
 ORDER BY a.ColA

ColC式に100を掛けて、分数ではなくパーセンテージを取得します。

Mac OSX10.7.3上のIBMInformix11.70.FC2に対してテストしたところ、両方のクエリで除算が機能し、同じ答えが得られました(質問で必要な0.71ではなく0.81が得られることに注意してください)。

Name1    218    0.34603174603174603174603174603175
Name2    157    0.5952380952380952380952380952381
Name3    134    0.80793650793650793650793650793651
Name4    121    1.0 

整数演算ではなく浮動小数点を使用して除算が行われるようにするには、CASTを使用する必要がある場合があります。ご覧のとおり、Informixでは必要ありませんでした(テーブルに数十億がある場合に備えて、SUMは浮動小数点の10進数です)。その中の行の4つだけではありません)。ROUND(xxxx, 2)小数点以下2桁までを使用して、プレゼンテーションを改善できます。DECIMAL(6,2)へのキャストでも同じ結果が得られますが、DBMSではなく、クライアントがプレゼンテーションを担当する必要があります。

于 2012-08-28T14:05:23.127 に答える
0

MS SQL Serverでは、これはそれを行います(ups、間違ったサブアグリゲーション->間違った結果):

create table #MyTempTable (cola varchar(10), colb int)

insert into #MyTempTable(cola,colb)
select 'Name1',218
union all
select 'Name2',157
union all
select 'Name3',134
union all
select 'Name4',121

SELECT otab.COLA, otab.COLB,
       cast(otab.COLB as float)/(select SUM(cast(itab.colb as float))
                                 from #MyTempTable itab where itab.cola >= otab.cola) 
  from #MyTempTable otab

drop table #MyTempTable
于 2012-08-28T14:14:08.023 に答える