sql >> データベース >  >> RDS >> Sqlserver

SQLの乗算集計演算子

    MULとは、値の漸進的な乗算を意味しますか?

    小さなサイズ(たとえば10秒)の行が100行ある場合でも、MUL(列)はすべてのデータ型をオーバーフローします。誤用/乱用の可能性が非常に高く、使用範囲が非常に限られているため、SQL標準である必要はありません。他の人が示しているように、SQLで標準的な(そして一般的な)方法を使用してトリッキーな計算を行う多くの方法があるのと同じように、それを解決する数学的な方法があります。

    サンプルデータ:

    Column
    1
    2
    4
    8
    
    COUNT : 4 items (1 for each non-null)
    SUM   : 1 + 2 + 4 + 8 = 15
    AVG   : 3.75 (SUM/COUNT)
    MUL   : 1 x 2 x 4 x 8 ? ( =64 )
    

    完全を期すために、Oracle、MSSQL、MySQLのコア実装*

    Oracle : EXP(SUM(LN(column)))   or  POWER(N,SUM(LOG(column, N)))
    MSSQL  : EXP(SUM(LOG(column)))  or  POWER(N,SUM(LOG(column)/LOG(N)))
    MySQL  : EXP(SUM(LOG(column)))  or  POW(N,SUM(LOG(N,column)))
    
    • SQLServerでEXP/LOGを使用する場合は、リターンタイプhttp://msdn.microsoft.com/en-us/library/ms187592.aspx
    • に注意してください。
    • POWERフォームでは、(オイラーの数よりも大きい底を使用して)より大きな数を使用できます。結果が大きくなりすぎて、POWERを使用して元に戻せない場合は、対数値のみを返し、実際の数を計算することができます。 SQLクエリ

    * LOG(0)およびLOG(-ve)は未定義です。以下は、SQLServerでこれを処理する方法のみを示しています。同じ概念を使用して、他のSQLフレーバーと同等のものを見つけることができます

    create table MUL(data int)
    insert MUL select 1 yourColumn union all
               select 2 union all
               select 4 union all
               select 8 union all
               select -2 union all
               select 0
    
    select CASE WHEN MIN(abs(data)) = 0 then 0 ELSE
           EXP(SUM(Log(abs(nullif(data,0))))) -- the base mathematics
         * round(0.5-count(nullif(sign(sign(data)+0.5),1))%2,0) -- pairs up negatives
           END
    from MUL
    

    材料:

    • データのabs()を取得し、minが0の場合、他の無駄なものを掛けると、結果は0になります
    • データが0の場合、NULLIFはそれをnullに変換します。 abs()とlog()はどちらもnullを返すため、sum()から除外されます
    • データが0でない場合、absを使用すると、LOGメソッドを使用して負の数を乗算できます。他の場所で負の数を追跡します
    • 最終的な兆候を見つける
      • sign(data)は 1 for> 0を返します 、 0 for 0 <0の場合は-1 。
      • さらに0.5を追加し、sign()を再度取得するため、0と1の両方を1に分類し、-1のみを-1に分類しました。
      • ネガティブをカウントするだけでよいので、ここでもNULLIFを使用してCOUNT()から1を削除します。
      • %2 負の数のcount()に対して、どちらかを返します
      • ->奇数の負の数がある場合は1
      • ->負の数が偶数の場合は0
      • より数学的なトリック:0.5から1または0を取り、上記が次のようになるようにします
      • ->( 0.5-1 =-0.5 => -1に丸めます )負の数が奇数の場合
      • ->( 0.5-0 =0.5 =>1に丸める )負の数が偶数の場合
      • 実際の結果のSUM-PRODUCT値に対して、この最終的な1/-1を乗算します


    1. MySQL CHAR()とT-SQL CHAR():違いは何ですか?

    2. マテリアライズされたパスでツリーを並べ替えますか?

    3. 結合を使用してPostgreSQLの異なるテーブルのデータを結合する

    4. SQLServerのチェック制約