在sqlite中可以查询吗?

时间:2019-07-18 10:21:33

标签: sql sqlite

我有一张这样的桌子:

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评估将在第一种情况下停止。

4 个答案:

答案 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))

检查下面的输出

enter image description here

或者如果要排除空白空间,则

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 !=' ';

enter image description here

相关问题