3

この質問の前に Sqlite 3 Insert and Replace が複数の一意の列で失敗する

私はスキーマを持つテーブルを持っています、

CREATE TABLE tbl_poll ( 
    id         INTEGER PRIMARY KEY AUTOINCREMENT,
    poll_id    STRING NOT NULL,
    ip_address STRING NOT NULL,
    opt        STRING NULL,
    CONSTRAINT 'unique_vote_per_poll_per_ip_address' UNIQUE ( poll_id, ip_address )  ON CONFLICT REPLACE 
);

私がする時、

select opt,count(opt) as count from tbl_poll where poll_id = 'jsfw' group by opt

結果は

opt            count
0                4
2                2 
3                2

つまり、4 人のユーザーが 0 のオプションを選択し、2 と 3 のオプションがそれぞれ 2 と 2 のユーザーによって選択されています。

次のような結果を得る方法はありますか

   opt            count    percent
    0                4        0.5       
    2                2        0.25 
    3                2        0.25

ここで、パーセント = カウント / 合計カウント

合計数、つまり (4+2+2 = 8 ) を取得できれば、問題も解決します。

私はこれを試しました、

   select opt,count(opt) as count from tbl_poll where poll_id = 'jsfw' 

しかし、どの列も同じではないため、機能しません。

4

2 に答える 2

3
SELECT opt
     , COUNT(*) AS count
     , ROUND(CAST(COUNT(*) AS REAL)/total, 2) AS percent 
FROM tbl_poll 
  CROSS JOIN
    ( SELECT COUNT(*) AS total 
      FROM tbl_poll 
      WHERE poll_id = 'jsfw' 
    ) AS t
WHERE poll_id = 'jsfw' 
GROUP BY opt ;
于 2012-06-10T22:07:34.513 に答える
0

opt から可能なすべての値がわかっている場合は、次のCASE WHENステートメントを使用できます。

SELECT COUNT(opt) as total, SUM(CASE WHEN opt = '0' OR opt IS NULL OR TRIM(opt) = '' THEN 1 ELSE 0 END) as total0, SUM(CASE WHEN opt = '1' THEN 1 ELSE 0 END) as total1, ... FROM tbl_poll WHERE poll_id = 'jsfw'

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

total    total0    total1    ...
8        4         0         ...

これがオプションのクローズド セットではない場合はお知らせください。

構文は次のとおりです。

CASE WHEN condition THEN result_for_true ELSE result_for_false END
CASE WHEN condition1 THEN result_for_1 WHEN condition2 THEN result_for_2 ELSE result_for_false_on_all END
于 2012-06-10T22:01:33.797 に答える