【问题标题】:SQL Query to summarize data for each column in tableSQL 查询汇总表中每一列的数据
【发布时间】:2015-08-11 19:44:16
【问题描述】:

我有一张这样的桌子

col_1 col_2 ... col_n
1      2    ...   3
2     -2    ...   
       0    ...   1

如何使用sql生成下表?

col_name min max count
col_1     1    2     2
col_2    -2    2     3
       ...
col_n     1    3     2

我基本上认为我需要转向某个地方,但我不知道如何

谢谢!

【问题讨论】:

  • 您使用的是什么 SQL RDBMS? SQL Server , MySql , Oracle ????
  • 理想情况下,我希望它尽可能通用..!但我现在正在使用 Oracle
  • 我认为这将是一个不重要的
  • .. 或将值存储在表中(id,值)创建多行而不是添加列,那么查询就是小菜一碟。
  • @maraca 我明白你的意思了......但你会如何处理呢?我在理解如何将列作为行时遇到问题

标签: sql pivot summary


【解决方案1】:

使用unpivot 应该可以,但您必须提前指定所有列。如果这不切实际,您可能需要研究动态 SQL 解决方案。

select
  col        as col_name,
  min(val)   as min, 
  max(val)   as max, 
  count(val) as count
from (
  select col, val 
  from t -- your table here
  unpivot (
    val for col in (col_1, col_2, col_n) -- your columns here
  ) u 
) r
group by col;

示例SQL Fiddle(Oracle 11g R2)

【讨论】:

  • 谢谢!动态的也很棒,至少对于学习而言:)
  • @Stephane 恐怕我无法帮助您,因为我对 Oracle/PLSQL 中的动态 SQL 了解不多。对于 MSSQL,这里有几个很好的答案,也许 Oracle 也有一些(我只是不知道)。
【解决方案2】:
select colname, min(val), max(val), count(*)
from (
select 'col_1' as colname,
col_1 as val
from t
union 
select 'col_2',
col_2
from t
-- and so on
) x
where val is not null
group by colname

这是另一种方法。感谢 JPW 的建议。

【讨论】:

  • 您的查询将无法正常工作,尽管基本思路是正确的;也许这就是你想要的:sqlfiddle.com/#!4/0ccba/11
  • 信不信由你..我正要发布那个。
  • 很好,因为它应该是这样的:)
  • 你肯定可以用的。
猜你喜欢
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-24
相关资源
最近更新 更多