我有一张这样的桌子:
ID A B C
0 x x
1 x
2 x x
3 x
我想通过查询(如果可能的话,使用SQLite语法)获取该信息
A 3
B 2
C 1
我一直在使用CASE WHEN子句
WITH solutions AS (SELECT
CASE
WHEN `B` = 'x' THEN 'A'
WHEN `B` = 'x' THEN 'B'
WHEN `C` = 'x' THEN 'C'
END AS 'Solution'
FROM use_cases)
SELECT solution, COUNT(*) AS 'Count'
FROM solutions
GROUP BY Solution ORDER BY COUNT(*) DESC
但是,如果一行中存在多于一个带有'x'的列,则它将不起作用,因为WHEN评估将在第一种情况下停止。
答案 0 :(得分:4)
使用union all
:
select col, count(*)
from (select 'A' as col from t where A = 'x' union all
select 'B' from t where B = 'x' union all
select 'C' from t where C = 'x'
) x
group by col
order by count(*) desc;
答案 1 :(得分:1)
您需要UNION ALL:
select 'A' col1, count(A = 'x') col2 from tablename
union all
select 'B', count(B = 'x') from tablename
union all
select 'C', count(C = 'x') from tablename
请参见demo。
或使用CTE
来避免对该表进行多次扫描:
with cte as (
select count(A = 'x') cola, count(B = 'x') colb, count(C = 'x') colc
from tablename
)
select 'A' col1, cola col2 from cte
union all
select 'B', colb from cte
union all
select 'C', colc from cte
请参见demo。
结果:
| col1 | col2 |
| ---- | ---- |
| A | 3 |
| B | 2 |
| C | 1 |
答案 2 :(得分:0)
如果您特别想检查X,则可以利用以下事实(至少在SQLite中)TRUE等于1,而FALSE等于0,这样类似以下的简单工作就可以了:
SELECT 'A', sum(A = 'x') from MyTable
UNION ALL
SELECT 'B', sum(B = 'x') from MyTable
UNION ALL
SELECT 'C', sum(C = 'x') from MyTable;
另一个简单的解决方案是依靠count()仅计算非空值这一事实。因此,如果列在不包含X的地方包含NULL,则此简单的SQL将在SQLite中起作用:
SELECT 'A', count(A) from MyTable
UNION ALL
SELECT 'B', count(B) from MyTable
UNION ALL
SELECT 'C', count(C) from MyTable;
上述内容的一个细微变化...如果不包含X的列中包含除NULL之外的其他内容,则只需将其转换为null。例如,如果不包含X的列恰好包含空格,则可以使用以下内容:
SELECT 'A', count(nullif (A, ' ')) from MyTable
UNION ALL
SELECT 'B', count(nullif (B, ' ')) from MyTable
UNION ALL
SELECT 'C', count(nullif (C, ' ')) from MyTable;
注意:我提出的方法可能需要对表进行多次扫描,但是如果索引正确,则可以减轻这种损失。基于CTE的解决方案可能会更有效,但是您必须测试两种方法才能确定。基于CTE的解决方案可能涉及根据潜在的多个子查询创建临时表(或临时结果集)。在某些情况下,所有这些都会使CTE的效率降低……但是YMMV。
答案 3 :(得分:-1)
尝试
Select val, cnt from ( SELECT 'A' as val,A,count(*) as cnt FROM TABLE
GROUP BY A
UNION
SELECT 'B' as val,B,count(*) as cnt FROM TABLE
Group by B
UNION
SELECT 'C' as val,C,count(*) as cnt FROM TABLE
Group by C))
检查下面的输出
或者如果要排除空白空间,则
SELECT VAL,CNT FROM(SELECT 'A' AS VAL,A as col,COUNT(*) AS CNT FROM SAMPLEE GROUP BY A
UNION
SELECT 'B' AS VAL,B as col,COUNT(*) AS CNT FROM SAMPLEE GROUP BY B
UNION
SELECT 'C' AS VAL,C as col,COUNT(*) AS CNT FROM SAMPLEE GROUP BY C
) where col !=' ';