【问题标题】:Summary query from several fields in SQLSQL 中多个字段的汇总查询
【发布时间】:2010-09-26 02:52:23
【问题描述】:

数据表结构为:
id1,id2,id3,id4,...(其他一些字段)。
我想创建摘要查询以找出每列中使用了某个 ID 值的次数。

数据
1,2,3,4,2008
2,3,5,1,2008
1,3,2,5,2007
1,2,3,6,2007
3,1,2,5,2007

对于值 1,结果应该是
1,0,0,1,2008
2,1,0,0,2007

如何通过一个查询(在 MySQL 中)完成此操作。

【问题讨论】:

  • 有什么理由只能进行一次查询?如果您只使用 4 个 count(*) 查询并在代码中收集总数,我会简单得多
  • 我想在 DBGrid 中显示信息 :)

标签: sql mysql count


【解决方案1】:

使用特征或增量函数:

DECLARE @look_for AS int
SET @look_for = 1

SELECT SUM(CASE WHEN id1 = @look_for THEN 1 ELSE 0 END) AS id1_count
    ,SUM(CASE WHEN id2 = @look_for THEN 1 ELSE 0 END) AS id2_count
    ,SUM(CASE WHEN id3 = @look_for THEN 1 ELSE 0 END) AS id3_count
    ,SUM(CASE WHEN id4 = @look_for THEN 1 ELSE 0 END) AS id4_count
FROM tbl

有一些方法可以根据您的表和不同的 ID 值生成此代码(也是一种在 SQL Server 中使用 PIVOT 和 UNPIVOT 的技术,它不是 ANSI)。

【讨论】:

  • 按年份添加组以确保完整性。
【解决方案2】:

这似乎是最好的解决方案(来自Wiki):

select years,
sum(1*(1-abs(sign(id1-56)))) as id1,
sum(1*(1-abs(sign(id2-56)))) as id2,
sum(1*(1-abs(sign(id3-56)))) as id3,
sum(1*(1-abs(sign(id4-56)))) as id4,
from mytable
group by years

【讨论】:

    【解决方案3】:

    选择

    (select count(id1) from t1 where id1 = @param) as id1,

    (select count(id2) from t2 where id2 = @param) as id2

    【讨论】:

    • 除非您的表在 id 列的 eash 和稀疏列上单独索引,否则特征函数版本(已被否决)在大多数情况下将优于此,因为这将执行多个表扫描.
    【解决方案4】:

    如果 X 是您要查找的 id 值,您可以这样做。

    select (select count(*) where id1 = X) as countid1 ... etc
    

    【讨论】:

      猜你喜欢
      • 2019-12-04
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 2013-09-24
      • 1970-01-01
      相关资源
      最近更新 更多