2015-08-11 4 views
0

У меня есть таблица, как этотSQL запросов для обобщения данных для каждого столбца в таблице

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 

Я в основном думал мне нужно повернуть куда-нибудь, но я не могу понять, как

Спасибо!

+0

, что SQL RDBMS вы используете? SQL Server, MySql, Oracle ???? –

+0

В идеале я хотел бы, чтобы он был как можно более общим. но я использую Oracle прямо сейчас – Stephane

+0

Я думаю, что это будет univot – JamieD77

ответ

2

Использование 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)

+0

Спасибо! динамика также была бы удивительной, по крайней мере, для учебных целей :) – Stephane

+0

@Stephane Боюсь, я не могу вам помочь, так как я мало знаю о динамическом SQL в Oracle/PLSQL. Для MSSQL здесь есть несколько хороших ответов на SO, возможно, для Oracle тоже есть некоторые (я просто не знаю). – jpw

1
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 за его предложения.

+0

Ваш запрос не будет работать, хотя основная идея правильная; возможно, это то, что вы намеревались: http://www.sqlfiddle.com/#!4/0ccba/11 – jpw

+0

поверьте мне или нет .. я как раз собирался опубликовать это. –

+0

Хорошо, потому что это то, что должно быть :) – jpw

Смежные вопросы