3

在这个问题之前 Sqlite 3 Insert and Replace 在超过 1 个唯一列上失败

我有一个带有架构的表,

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 回答