2

SQL Server2008R2でいくつかのクロス集計を実行しようとしています。その部分は問題ありませんが、各セルのパーセンテージを取得しようとすると、問題が発生します。

これが蒸留されたユースケースです:人々が彼らの好きな色と彼らの好きな果物を与える調査。与えられた果物と与えられた色が好きな人の数を知りたいです:

with survey as (
    select 'banana' fav_fruit, 'yellow' fav_color
     union select 'banana', 'red'
     union select 'apple', 'yellow'
     union select 'grape', 'red'
     union select 'apple', 'blue'
     union select 'orange', 'purple'
     union select 'pomegranate', 'green'
)
select
    s.fav_color, 
    sum(case 
          when s.fav_fruit = 'banana' then 1
          else 0
        end) as banana, 
    sum(case 
           when s.fav_fruit = 'banana' then 1
           else 0
         end) / sum(1)   -- why does division always yield 0? "+", "-", and "*" all behave as expected.
         * 100 as banana_pct,
     sum(1) as total
from 
    survey s
group by
    s.fav_color;

結果:

fav_color   banana banana_pct  total
------------------------------------
blue        0      0            1
green       0      0            1
purple      0      0            1
red         1      0            2
yellow      1      0            2

私が期待していたこと:

fav_color   banana banana_pct  total
------------------------------------
blue        0      0           1
green       0      0           1
purple      0      0           1
red         1      50          2
yellow      1      50          2

私が期待していたものを手に入れるのを手伝ってください。

4

3 に答える 3

7

SQL Server を使用しています。問題を再現する、より単純な例を次に示します。

select 1/2

SQL Server は整数除算を行います。

分母をorの代わりにsum(1.0)orのようなものに置き換えます。sum(cast 1 as float)sum(1e0)sum(1)

少なくとも私の予想に反して、SQL Server は小数点付きの数値float. 小数点以下のスペースの固定数は、後続の操作に影響を与える可能性があります。

于 2013-01-14T20:56:04.757 に答える
1

クエリ:

SQLFiddle例

SELECT s.fav_color,
       sum( CASE WHEN s.fav_fruit = 'banana' THEN 1 ELSE 0 END ) AS banana,
       sum( CASE WHEN s.fav_fruit = 'banana' THEN 1 ELSE 0 END) / sum(1.00) -- why does division always yield 0? "+", "-", and "*" all behave as expected.
 * 100 AS banana_pct,
   sum(1) AS total
FROM survey s
GROUP BY s.fav_color

結果:

| FAV_COLOR | BANANA | BANANA_PCT | TOTAL |
-------------------------------------------
|      blue |      0 |          0 |     1 |
|     green |      0 |          0 |     1 |
|    purple |      0 |          0 |     1 |
|       red |      1 |         50 |     2 |
|    yellow |      1 |         50 |     2 |
于 2013-01-14T20:59:19.437 に答える
0

最近 IIF 関数を発見しました。それは物事をよりきれいにします。上記のジャスティンの例を取り上げます。

SELECT s.fav_color,
       sum( IIF(s.fav_fruit = 'banana', 1,0) AS banana,
       sum( IIF(s.fav_fruit = 'banana', 1,0) / sum(1.00) 
 * 100 AS banana_pct,
   sum(1) AS total
FROM survey s
GROUP BY s.fav_color
于 2021-10-12T14:31:16.273 に答える