有没有一种方法可以在SQL中对组执行操作?
所以我对SQL非常陌生,可能没有准确地描述我想要做什么。我有一个有三列的表,我想按一列分组,看看在另一列中每个组中有多少百分比具有特定值。例如,在表中:有没有一种方法可以在SQL中对组执行操作?,sql,sqlite,aggregate-functions,Sql,Sqlite,Aggregate Functions,所以我对SQL非常陌生,可能没有准确地描述我想要做什么。我有一个有三列的表,我想按一列分组,看看在另一列中每个组中有多少百分比具有特定值。例如,在表中: id col1 col2 ---------------- 0 A 1 1 A 2 2 B 2 3 B 2 4 A 1 我想按col1分组,看看每个组(A或B)中col2中值为1的百分比。我想从中得到的结果是: col1 percent
id col1 col2
----------------
0 A 1
1 A 2
2 B 2
3 B 2
4 A 1
我想按col1
分组,看看每个组(A
或B
)中col2
中值为1的百分比。我想从中得到的结果是:
col1 percentage_col2_equals_1
------------------------------
A 66.7
B 0.0
到目前为止,我已经:
SELECT col1,
((SELECT COUNT(*) FROM my_table
WHERE col2 = 1
GROUP BY col1) /
(SELECT COUNT(*) FROM my_table
GROUP BY col1) * 100)
FROM my_table
GROUP BY col1;
但这是行不通的。任何帮助都将不胜感激 在
SELECT col1,(coalesce(count(case when col2=1 then col2 end),0)*100.00)/count(*)
from tablename
group by col1
以下查询将返回预期结果:
SELECT col1,
CAST(((SUM(IIF(col2 = 1, 1, 0))) * 100.0) / COUNT(*) AS DECIMAL(5, 1)) AS percentage_col2_equals_1
FROM my_table
GROUP BY col1;
使用示例数据执行示例:
DECLARE @my_table TABLE (id INT, col1 CHAR(1), col2 INT);
INSERT INTO @my_table (id, col1, col2) VALUES
(0, 'A', 1),
(1, 'A', 2),
(2, 'B', 2),
(3, 'B', 2),
(4, 'A', 1);
SELECT col1, CAST(((SUM(IIF(col2 = 1, 1, 0))) * 100.0) / COUNT(*) AS DECIMAL(5, 1)) AS percentage_col2_equals_1
FROM @my_table
GROUP BY col1;
输出:
col1 percentage_col2_equals_1
---------------------------------
A 66.7
B 0.0
| col1 | ?column? |
| ---- | ---------------------- |
| A | 0.66666666666666666667 |
| B | 0.00000000000000000000 |
| col1 | p_a |
| ---- | ---- |
| A | 66.7 |
| B | 0.0 |
| col1 | p_b |
| ---- | ---- |
| A | 66.7 |
| B | 0.0 |
答案和大家一样,只是因为博士后的表达能力,才把这个放在这里:) 现场测试: 输出:
col1 percentage_col2_equals_1
---------------------------------
A 66.7
B 0.0
| col1 | ?column? |
| ---- | ---------------------- |
| A | 0.66666666666666666667 |
| B | 0.00000000000000000000 |
| col1 | p_a |
| ---- | ---- |
| A | 66.7 |
| B | 0.0 |
| col1 | p_b |
| ---- | ---- |
| A | 66.7 |
| B | 0.0 |
要将其表示为小数点后1位的百分比,请将其乘以100并四舍五入为1:
现场测试:
输出:
col1 percentage_col2_equals_1
---------------------------------
A 66.7
B 0.0
| col1 | ?column? |
| ---- | ---------------------- |
| A | 0.66666666666666666667 |
| B | 0.00000000000000000000 |
| col1 | p_a |
| ---- | ---- |
| A | 66.7 |
| B | 0.0 |
| col1 | p_b |
| ---- | ---- |
| A | 66.7 |
| B | 0.0 |
这将有助于:
CREATE TABLE Table1
("id" int, "col1" varchar2(1), "col2" int)
;
//do inserts
select aa."col1",((select count(*) from Table1 b
where b."col1"=aa."col1" and b."col2"=1 )*100/(select count(*)
from Table1 c where c."col1"='A' )) percentge
from Table1 aa
group by aa."col1"
;
输出:
A 66.66666666666666666666666666666666666667
B 0
在SQLite中,表达式
col2=1
在true
时返回1
,在false
时返回0
因此,您只需要求
col2=1的平均值,然后将其四舍五入到1位小数:
select
col1,
round(100.0 * avg(col2 = 1), 1) percentage_col2_equals_1
from tablename
group by col1
请参阅。
结果:
过滤器(…)
语法实际上是SQL标准的一部分,它不是特定于Postgres的。然而,只有很少的数据库管理系统真正实现了这一点(据我所知,其他的只有HSQLDB和SQLite)@a_horse_,没有_名字很高兴知道它是SQL标准。Postgres是最符合SQL标准的数据库,当SQL标准中有一个新功能时,它总是处于领先地位,这有时给我的印象是,一个功能是特定于Postgres的:DYou可以使用小提琴来避免重复回答中的数据。这里有一个很好的方法:不需要手动键入DDL和创建数据,只需将文本单击到DDL,然后粘贴OP的文本数据。它将生成DDL并为YouTunks创建数据。我将尝试它。我正在Python上使用SQLite3