2017-10-15 5 views
1

を使用し2つの列の間のパーセンテージ:計算、私は次のことを行い、SQL Serverのストアドプロシージャ書いTOP句

  1. は輸入額との合計を計算し、トップ5の輸入を取得します

    01:各
  2. のための輸入量は、全体の総輸入値とボリューム

に対する割合は、ここに私のクエリの計算します

DECLARE @OVERALL_TOTAL_VAL AS BIGINT 
    DECLARE @OVERALL_TOTAL_VOL AS BIGINT 

    SET NOCOUNT ON; 

    -- GET TOTAL VALUE AND VOLUME FROM ALL IMPORTERS TO USE FOR GETTING THE % 
    SET @OVERALL_TOTAL_VAL = (SELECT SUM(IMPORTEDVALUE) 
           FROM [DBO].[ALERT] 
           WHERE IMPORTERCODE != 0) 
    SET @OVERALL_TOTAL_VOL = (SELECT SUM(IMPORTEDVOLUME) 
           FROM [DBO].[Alert] 
           WHERE IMPORTERCODE != 0) 

    -- GET TOP 5 IMPORTERS 
    SELECT 
     TOP 5 IMPORTERCODE, 
     @OVERALL_TOTAL_VAL TOTAL_VAL, 
     @OVERALL_TOTAL_VOL TOTAL_VOL, 
     SUM(IMPORTEDVALUE) TOTAL_IMPORT_VALUE, 
     SUM(IMPORTEDVOLUME) TOTAL_IMPORT_VOL, 
     --((SUM(IMPORTEDVALUE)/@OVERALL_TOTAL_VAL) * 100) NET_VAL, 
     --((SUM(IMPORTEDVOLUME)/@OVERALL_TOTAL_VOL) * 100) NET_VOL, 
     --(((SELECT SUM(IMPORTEDVALUE) 
     -- FROM [DBO].[ALERT] 
     -- WHERE IMPORTERCODE = A1.IMPORTERCODE 
     -- GROUP BY IMPORTERCODE)/@OVERALL_TOTAL_VAL) * 100) NET_VAL, 
     COUNT(*) ALERT_COUNT 
    FROM [DBO].[ALERT] A1 

    WHERE IMPORTERCODE != 0 
    GROUP BY IMPORTERCODE 
    ORDER BY ALERT_COUNT DESC; 

コメントアウトされた行は私が試した行ですが、残念ながらうまくいきませんでした。私もクロス結合を試みました(Get column sum and use to calculate percent of total (mySQL)経由)。同様にうまくいかなかった。

これは私のSELECTの文にTOP 5が含まれているためですか?私がしようとしていることは可能ですか?もしそうでなければ、私のアプリのフロントエンド側でパーセンテージ計算をしなければならないので、可能ならばそれを避けたい。

助けてください。ありがとうございました。

更新日:最後に動作させました。結局のところ、パラメータの必要はなかったと思う。助けてくれたlad2025ありがとう!

SELECT DISTINCT 
    TOP 5 IMPORTERCODE, 
    SUM(IMPORTEDVALUE) OVER(PARTITION BY IMPORTERCODE) AS TOTAL_IMPORT_VAL, 
    SUM(IMPORTEDVOLUME) OVER(PARTITION BY IMPORTERCODE) AS TOTAL_IMPORT_VOL, 
    100.0 * SUM(IMPORTEDVALUE) OVER (PARTITION BY IMPORTERCODE)/ 
      SUM(IMPORTEDVALUE) OVER() AS NET_VAL, 
    100.0 * SUM(IMPORTEDVOLUME) OVER (PARTITION BY IMPORTERCODE)/ 
      SUM(IMPORTEDVOLUME) OVER() AS NET_VOL, 
    COUNT(*) OVER(PARTITION BY IMPORTERCODE) ALERT_COUNT 
FROM [DBO].[ALERT] 
WHERE IMPORTERCODE != 0 
ORDER BY ALERT_COUNT DESC; 

答えて

2

あなたはwindowed functionsを使用することができます。

SELECT DISTINCT TOP 5 IMPORTERCODE, 
    SUM(IMPORTEDVALUE) OVER(PARTIITON BY IMPORTERCODE) AS total_import_value 
    SUM(IMPORTEDVOLUME) OVER(PARTIITON BY IMPORTERCODE) AS total_import_volumne, 
    100.0 * SUM(IMPORTEDVALUE) OVER(PARTIITON BY IMPORTERCODE)/ 
      SUM(IMPORTEDVALUE) OVER() AS [% value percentage], 
    100.0 * SUM(IMPORTEDVOLUME) OVER(PARTIITON BY IMPORTERCODE)/ 
      SUM(IMPORTEDVOLUME) AS [% volume percentage] 
FROM [DBO].[ALERT] 
WHERE IMPORTERCODE != 0 
ORDER BY total_import_value DESC 
+0

感謝を!クエリで使用された 'OVER()'を見るのは初めてのことです。ウィンドウ関数の意味ですか?それは何をするためのものか? –

+1

これは機能しています!私は 'COUNT()'の結果が必要だったので少し修正しなければなりませんでした。ご協力ありがとうございました! –

+0

@DeeJ。はい、「オーバー」はウィンドウ関数用です。 – lad2025

関連する問題