SQL 根据条件汇总
SQL summarise based on condition
假设我有一个名为 Table1
的 table,它包含三列,VALUE
、CODE
和 TYPE
。 VALUE
列包含不同问题的 1-4 分。 CODE
列包含与问题相关的代码。 TYPE
列表示问题是纸质 (PAP) 还是在线 (ONL) 调查的一部分。
下面是 table 的一瞥。
#Table1
VALUE CODE TYPE
----- ------ ------
2 Q2 ONL
1 Q2 PAP
3 Q2 ONL
4 Q2 ONL
1 Q2 ONL
1 Q2 ONL
1 Q2 PAP
2 Q2 ONL
4 Q2 ONL
2 Q2 ONL
3 Q1 ONL
1 Q1 ONL
4 Q1 ONL
3 Q1 ONL
and so on...
我的Objective
使用 SQL 查询 (Oracle) 来总结这个 table 这样-
1) 我首先 计算 所有值 1's 或 2's 对于 CODE
Q2
2) 然后将该数字除以 Q2
的 总数 个值
3) 按 TYPE
对结果进行分组,以便我对 ONL 和 PAP.[=23 的结果进行分组=]
预期结果
所以在我们的例子中,这个查询的结果是 -
TYPE SCORE
PAP 0.625 (5/8)
ONL 1 (2/2)
我的尝试
虽然这看起来很简单,但我似乎无法获得正确的值。我觉得这需要一个嵌套查询来存储不同的值,但我找不到正确的例子来指导我。这是我的错误尝试-
SELECT TYPE, VALUE/COUNT(VALUE) as SCORE FROM Table1
where
CODE = 'Q2' AND
VALUE in (1,2)
GROUP BY TYPE
任何帮助将不胜感激。
这里是:
select type, cnt_value/sum_value as score
FROM (
SELECT type, count (value) as cnt_value , sum (value) as sum_value
FROM Table1
WHERE
CODE = 'Q2' AND
VALUE in (1,2)
GROUP by type
)
你可以简单地做:
select type, avg(case when value in (1, 2) then 1.0 else 0 end)
from table1
where code = 'Q2'
group by type;
有几种方法可以做到这一点。
您查询的问题是您没有执行第二步 - 获取 Q2 的响应总数。
这是我的 SQLFiddle:http://www.sqlfiddle.com/#!9/898b3f/7
SELECT TYPE,
COUNT(VALUE),
(select count(*) from table1 where code = 'Q2') ,
COUNT(VALUE) / (select count(*) from table1 where code = 'Q2') as score
FROM Table1
where
CODE = 'Q2' AND
VALUE in (1,2)
GROUP BY TYPE
假设我有一个名为 Table1
的 table,它包含三列,VALUE
、CODE
和 TYPE
。 VALUE
列包含不同问题的 1-4 分。 CODE
列包含与问题相关的代码。 TYPE
列表示问题是纸质 (PAP) 还是在线 (ONL) 调查的一部分。
下面是 table 的一瞥。
#Table1
VALUE CODE TYPE
----- ------ ------
2 Q2 ONL
1 Q2 PAP
3 Q2 ONL
4 Q2 ONL
1 Q2 ONL
1 Q2 ONL
1 Q2 PAP
2 Q2 ONL
4 Q2 ONL
2 Q2 ONL
3 Q1 ONL
1 Q1 ONL
4 Q1 ONL
3 Q1 ONL
and so on...
我的Objective
使用 SQL 查询 (Oracle) 来总结这个 table 这样-
1) 我首先 计算 所有值 1's 或 2's 对于 CODE
Q2
2) 然后将该数字除以 Q2
的 总数 个值3) 按 TYPE
对结果进行分组,以便我对 ONL 和 PAP.[=23 的结果进行分组=]
预期结果
所以在我们的例子中,这个查询的结果是 -
TYPE SCORE
PAP 0.625 (5/8)
ONL 1 (2/2)
我的尝试
虽然这看起来很简单,但我似乎无法获得正确的值。我觉得这需要一个嵌套查询来存储不同的值,但我找不到正确的例子来指导我。这是我的错误尝试-
SELECT TYPE, VALUE/COUNT(VALUE) as SCORE FROM Table1
where
CODE = 'Q2' AND
VALUE in (1,2)
GROUP BY TYPE
任何帮助将不胜感激。
这里是:
select type, cnt_value/sum_value as score
FROM (
SELECT type, count (value) as cnt_value , sum (value) as sum_value
FROM Table1
WHERE
CODE = 'Q2' AND
VALUE in (1,2)
GROUP by type
)
你可以简单地做:
select type, avg(case when value in (1, 2) then 1.0 else 0 end)
from table1
where code = 'Q2'
group by type;
有几种方法可以做到这一点。
您查询的问题是您没有执行第二步 - 获取 Q2 的响应总数。
这是我的 SQLFiddle:http://www.sqlfiddle.com/#!9/898b3f/7
SELECT TYPE,
COUNT(VALUE),
(select count(*) from table1 where code = 'Q2') ,
COUNT(VALUE) / (select count(*) from table1 where code = 'Q2') as score
FROM Table1
where
CODE = 'Q2' AND
VALUE in (1,2)
GROUP BY TYPE