最高值和最低值

最高值和最低值

问题描述:

我得到我的所有列细节象下面这样:最高值和最低值

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'table1' 
    AND DATA_TYPE IN ('int','decimal','numeric') 

我的表结构如下图所示:

CREATE TABLE [dbo].[table1](
[col1] int not NULL, 
[col2] [numeric](7, 0) NULL, 
[col3] [varchar](30) NULL, 
[col4] [varchar](8) NULL, 
[col5] [varchar](2) NULL, 
[col6] [varchar](8) NULL, 
[col7] [varchar](3) NULL, 
[col8] [varchar](7) NULL, 
[col9] [varchar](5) NULL, 
[col10] [varchar](8) NULL, 
[col11] [numeric](7, 0) NULL, 
[col12] [numeric](7, 3) NULL, 
[col13] [numeric](7, 2) NULL, 
[col14] [decimal](7, 2) NULL, 
[col15] [varchar](1) NULL, 
) ON [PRIMARY] 

下面是几个例子值时,我“M查询表1

col1 col2  col11  col12  col13  col14 
------------------------------------------------------------ 
1  10.0  80.00  10.000  12.00  90.00 
2  70.0  10.00  97.960  14.00  10.00 
3  30.00  12.00  14.000  115.00  11.00 
4  40.00  11.00  15.000  15.80  12.00 

我想我的结果是这样的:

for max: 

Table_name max_col_name  max_col_value  max_col_value_length 
--------------------------------------------------------------------- 
table1  col3    115.00    6 


for min value: 

Table_name min_col_name  min_col_value  min_col_value_length 
--------------------------------------------------------------------- 
table1  col1    1     1 

我该如何达到这个目标?

+0

我想你会需要一些动态SQL这里,因为它找到了最小值/最大值查询本身值必须在飞行中生成。 –

+0

你想解决什么问题?因为像SQL这样的任务在SQL之外的代码层可能会更好地处理,因为它不是一个真正的关系操作? –

+0

我有超过20个Millon记录的表格,而不是逐个搜索和查找,我想要一些查询来给出结果。 – AskMe

您可以使用下面的代码来获得所需的结果。如果列名是动态的,那么你可以很容易地将下面的代码转换为动态SQL。

CREATE TABLE [dbo].[table1](
[col1] int not NULL, 
[col2] [numeric](7, 0) NULL, 
[col3] [varchar](30) NULL, 
[col4] [varchar](8) NULL, 
[col5] [varchar](2) NULL, 
[col6] [varchar](8) NULL, 
[col7] [varchar](3) NULL, 
[col8] [varchar](7) NULL, 
[col9] [varchar](5) NULL, 
[col10] [varchar](8) NULL, 
[col11] [numeric](7, 0) NULL, 
[col12] [numeric](7, 3) NULL, 
[col13] [numeric](7, 2) NULL, 
[col14] [decimal](7, 2) NULL, 
[col15] [varchar](1) NULL, 
) ON [PRIMARY] 
GO 

insert into table1 (col1,col2,col11,col12,col13,col14) values 
(1,  10.0 , 80.00,  10.000 , 12.00 , 90.00), 
(2,  70.0 , 10.00 , 97.960 , 14.00  , 10.00), 
(3,  30.00,  12.00 , 14.000 , 115.00 , 11.00), 
(4,  40.00,  11.00 , 15.000  , 15.80 , 12.00) 

declare @sql varchar(max) 
declare @col varchar(max)='' 
select @[email protected]+ COLUMN_NAME +', ' FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'table1' 
    AND DATA_TYPE IN ('int','decimal','numeric') 

SELECT ColumnName,ColumnValue 
into #TableMax 
from (select cast(max(col1) as numeric(7,3))C1, CAST(max(col2) as numeric(7,3))C2, 
              cast(max(col11) as numeric(7,3))C11, CAST(max(col12) as numeric(7,3))C12, 
              CAST(max(col13) as numeric(7,3))C13, CAST(Max(col14) as numeric(7,3))C14 

from table1) T 
Unpivot(ColumnValue For ColumnName IN (C1,C2,C11,C12,C13,C14)) AS H 

SELECT ColumnName,ColumnValue 
into #TableMin 
from (select cast(Min(col1) as numeric(7,3))C1, CAST(Min(col2) as numeric(7,3))C2, 
              cast(Min(col11) as numeric(7,3))C11, CAST(Min(col12) as numeric(7,3))C12, 
              CAST(Min(col13) as numeric(7,3))C13, CAST(Min(col14) as numeric(7,3))C14 

from table1) T 
Unpivot(ColumnValue For ColumnName IN (C1,C2,C11,C12,C13,C14)) AS H 

select top 1 columnname max_columnname,columnvalue max_columnvalue,len(columnvalue)max_col_value_length from #TableMax order by columnvalue desc 
select top 1 columnname min_columnname,columnvalue min_columnvalue,len(columnvalue)min_col_value_length from #TableMin order by columnvalue 
drop table table1 
drop table #TableMax 
drop table #TableMin 

检查:

DECLARE @TB TABLE(col1 int, col2 decimal(10,2), col11 decimal(10,3), col12 decimal(10,2),col13 decimal(10,2),col14 decimal(10,2)) 
insert into @tb 
select 1 ,  10.0 , 80.00 , 10.000 , 12.00 , 90.00 union all 
select 2 ,  70.0 , 10.00 , 97.960 , 14.00 , 10.00 union all 
select 3 ,  30.00 , 12.00 , 14.000 , 115.00 , 11.00 union all 
select 4 , 40.00 , 11.00 , 15.000 ,  15.80 , 12.00 





select 'table1' as Table_Name,b.column_name as max_col_name, cast(a.max_col as decimal(10,2)) as max_col_value , len(cast(a.max_col as decimal(10,2))) as max_col_value_length from 
(select max(max_col1) as max_col from 
(select max(col1) as max_col1,'col1' as column_name from @tb union all 
select max(col2) as max_col2,'col2' from @tb union all 
select max(col11)as max_col11,'col11' from @tb union all 
select max(col12)as max_col12,'col12' from @tb union all 
select max(col13)as max_col13,'col13' from @tb union all 
select max(col14)as max_col14,'col14' from @tb) as a) as a 

left join 

(select max(max_col1) as max_col,column_name from 
(select max(col1) as max_col1,'col1' as column_name from @tb union all 
select max(col2) as max_col2,'col2' from @tb union all 
select max(col11)as max_col11,'col11' from @tb union all 
select max(col12)as max_col12,'col12' from @tb union all 
select max(col13)as max_col13,'col13' from @tb union all 
select max(col14)as max_col14,'col14' from @tb) as a group by column_name) as b 
on a.max_col = b.max_col 








select 'table1' as Table_Name,b.column_name as min_col_name, cast(a.min_col as integer) as min_col_value , len(cast(a.min_col as integer)) min_col_value_length from 
(select min(min_col1) as min_col from 
(select min(col1) as min_col1,'col1' as column_name from @tb union all 
select min(col2) as min_col2,'col2' from @tb union all 
select min(col11)as min_col11,'col11' from @tb union all 
select min(col12)as min_col12,'col12' from @tb union all 
select min(col13)as min_col13,'col13' from @tb union all 
select min(col14)as min_col14,'col14' from @tb) as a) as a 

left join 

(select min(min_col1) as min_col,column_name from 
(select min(col1) as min_col1,'col1' as column_name from @tb union all 
select min(col2) as min_col2,'col2' from @tb union all 
select min(col11)as min_col11,'col11' from @tb union all 
select min(col12)as min_col12,'col12' from @tb union all 
select min(col13)as min_col13,'col13' from @tb union all 
select min(col14)as min_col14,'col14' from @tb) as a group by column_name) as b 
on a.min_col = b.min_col 

结果为最大:

table1 col13 115.00 6 

结果为分:

table1 col1 1 1 
+0

谢谢。但是,我有列表的列数在10 - 50之间变化。这是一些表格有10列,有些列有50列。可以变动吗? – AskMe

+0

这都是你的,如果你有很多列......你可以编辑上面的答案并添加你想要的其他列。重要的是你已经有一个指导如何做到这一点。 –

我认为你可以用两个步骤实现这一点,首先然后搜索每列的最大值或最小值不旋转它(旋转表格,使列成为行,成为列)找到整体的最大值或最小值。

此查询将查找最大值

WITH cte1 AS (SELECT 'table1' AS Table_name 
         ,max_col_name 
         ,max_col_value 
         ,LEN(max_col_value) AS max_col_value_length 
       FROM 
        (SELECT col2,col3,col4 
        FROM 
        (SELECT MAX(col2) AS col2 
          ,MAX(col3) AS col3 
          ,MAX(col4) AS col4 FROM table1) x) y 
        UNPIVOT 
        (Nilai FOR max_col_name IN (col2,col3,col4)) unpvt) 

SELECT * FROM cte 
WHERE max_col_value = (SELECT MAX(max_col_value) FROM cte) 

要找到最小值只是改变所有最大与最小值