【问题标题】:How to select count over 2 columns in sql如何在sql中选择超过2列的计数
【发布时间】:2015-04-15 02:15:31
【问题描述】:

有人可以向我建议一个查询以从 2 列中获取组合计数。我的具体要求如下:

A     B       Permission
--------------------------
1     2       accept   
2     3       accept   
3     4       accept   
1     6       accept   
1     4       accept   
2     1       accept   
3     1       accept   
4     1       pending   

我想要计数 1 是否属于 AB 并且权限是“accept”。对于上面的例子,我需要输出为5

【问题讨论】:

  • 你能显示你预期的输出格式吗?为什么5
  • 您列出了 3 个不同的数据库。请选择1
  • 乔恩,数据库不是问题。如果我得到任何特定数据库的解决方案,那就太好了。以后我可以把一个转换成另一个
  • 如果你还有一行[ 1, 1, 'accept']数据; count(1) 是什么?
  • 从我的需求角度来看,情况并非如此。

标签: mysql sql sql-server postgresql


【解决方案1】:

您可以通过首先使用UNION ALL 对数据进行反规范化,然后使用COUNT 来实现所需的结果:

WITH SampleData(A, B, Permission) AS(
    SELECT 1, 2, 'accept' UNION ALL
    SELECT 2, 3, 'accept' UNION ALL
    SELECT 3, 4, 'accept' UNION ALL
    SELECT 1, 6, 'accept' UNION ALL
    SELECT 1, 4, 'accept' UNION ALL
    SELECT 2, 1, 'accept' UNION ALL
    SELECT 3, 1, 'accept' UNION ALL
    SELECT 4, 1, 'pending'
)
SELECT
    t.ColValue,
    ValueCount = COUNT(*)
FROM (
    SELECT
         Col = 'A', ColValue = A, Permission
    FROM SampleData
    UNION ALL
    SELECT
         Col = 'B', ColValue = B, Permission
    FROM SampleData
) t
WHERE Permission = 'accept'
GROUP BY t.ColValue

结果

ColValue    ValueCount
----------- -----------
1           5
2           3
3           3
4           2
6           1

【讨论】:

  • 没问题,很高兴能帮上忙。
【解决方案2】:
SELECT COUNT(*) FROM table WHERE (A=1 OR B=1) AND Permission LIKE 'accept'

你是说这个吗?

【讨论】:

  • 不,在您的查询中,我必须指定 A=1 或 B=1,而我需要对所有可能的值进行分组,如下所示:1 => 5, 2 => 3, 3 => 3, 4 => 2, 6 => 1 .......我希望你明白我需要什么
【解决方案3】:

正如你所说的AB,我认为当你在AB 中有1 时,这意味着1 个计数;所以我建议这个编辑过的查询?

SELECT M, COUNT(*) As C 
FROM (
    SELECT A as M, Permission
    FROM yourTable
    UNION ALL
    SELECT B, Permission
    FROM yourTable 
    WHERE A <> B) Dt
WHERE Permission = 'accept'
GROUP BY M

【讨论】:

    【解决方案4】:

    我得到了答案并将其更改为适用于 postgre:


    WITH SampleData(auid, buid, permission) AS(
     SELECT 1, 2, 'accept' UNION ALL
     SELECT 2, 3, 'accept' UNION ALL
     SELECT 3, 4, 'accept' UNION ALL
     SELECT 1, 6, 'accept' UNION ALL
     SELECT 1, 4, 'accept' UNION ALL
     SELECT 2, 1, 'accept' UNION ALL
     SELECT 3, 1, 'accept' UNION ALL
     SELECT 4, 1, 'pending')
     SELECT  t.col,   COUNT(*)as count 
     FROM (
      SELECT  auid as col, permission  FROM SampleData
      UNION ALL
      SELECT  buid as col, permission  FROM SampleData
     ) t
     WHERE permission = 'accept'
     GROUP BY t.col
    

    结果

    col          count
    -----------  -----------
    1            5
    2            3
    3            3
    4            2
    6            1
    

    【讨论】:

      猜你喜欢
      • 2018-05-27
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多