Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种方法可以在SQL中对组执行操作?_Sql_Sqlite_Aggregate Functions - Fatal编程技术网

有没有一种方法可以在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

所以我对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  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