0

私はdb2を使用していますが、どのバージョンかわかりません。テーブルを合計しようとすると、オーバーフロー エラーが発生します。合計をBIGINTにキャストできると思っていましたが、これは合計で機能しているように見えますが、パーセンテージを求めていて、BIGINTにキャストするとデータが不正確になります。Percent_DeliveredB/A の正確なパーセンテージを取得するにはどうすればよいですか? 分子と分母を BIGINT に変換し、パーセンテージで割っても正しい結果が得られません。

これが私のスクリプトです:

SELECT 
FAT.DIM_BUILDING_ID,
FAT.BUILDING_NAME,
SUM(CAST(FAT.AMOUNT AS BIGINT)) AS SALES_SUM,
SUM(CAST(FAT.ORDERS AS BIGINT)) AS ORDERS_SUM,
SUM(CAST(FAT.CAPABILITY AS BIGINT)) AS CAPABILITY_SUM,
SUM(FAT.ORDERS_B)/sum(FAT.Amount) AS Percent_DeliveredB,
SUM(FAT.ORDERS_A)/sum(FAT.Amount) AS Percent_DeliveredA,
SUM(CAST(FTS.GROUP_A AS BIGINT)) AS GROUP_A,
SUM(CAST(FTS.GROUP_B AS BIGINT)) AS GROUP_B,
SUM(CAST(FTS.GROUP_C AS BIGINT)) AS GROUP_C  

FROM ORDERS AS FAT
INNER JOIN GROUPS AS FTS ON FAT.DIM_PROJECT_ID = FTS.DIM_PROJECT_ID
GROUP BY FAT.DIM_BUILDING_ID, FAT.BUILDING_NAME;

次のことを試しましたが、パーセンテージが0で返されます。

SUM(CAST(FAT.ORDERS_B AS BIGINT))/sum(CAST(FAT.Amount AS BIGINT)) AS Percent_DeliveredB
4

3 に答える 3

3

doubleに変換して正しい結果を得ることができました。

SUM(CAST(FAT.ORDERS_B AS DOUBLE))/sum(CAST(FAT.Amount AS DOUBLE)) AS Percent_DeliveredB,
于 2013-09-25T16:10:56.327 に答える
2

1 未満の値を整数 (または BIGINT) にキャストすると、明らかに 0 に切り捨てられるため、正しい結果が得られます。小数が必要な場合は、DECIMAL または FLOAT データ型を使用します。

cast(SUM(FAT.ORDERS_B) as decimal(10,2)) / 
cast(sum(FAT.Amount) as decimal(10,2)) AS Percent_DeliveredB

もちろん、必要に応じて正しい精度を使用してください。

于 2013-09-25T15:03:00.857 に答える