从表中创建统计数据

时间:2015-06-17 21:53:54

标签: c++ sql sql-server

我有一个包含20列测量值的表格。我希望'转换'该表成为一个包含20行的表,其中包含Avg,Min,Max,StdDev,Count类型的信息。还有另一个这样的问题,但它是针对' R'语言。 Other question here.

我可以为每个列执行以下操作(使用C ++处理结果):

    Select Count(Case When [avgZ_l1] <= 0.15 and avgZ_l1 > 0 then 1 end) as countValue1, 
Count(case when [avgZ_l1] <= 0.16 and avgZ_l1 > 0.15 then 1 end) as countValue2,
Count(case when [avgZ_l1] <= 0.18 and avgZ_l1 > 0.16 then 1 end) as countValue3, 
Count(case when [avgZ_l1] <= 0.28 and avgZ_l1 > 0.18 then 1 end) as countValue4,
Avg(avgwall_l1) as avg1, Min(avgwall_l1) as min1, Max(avgZ_l1) as max1, 
STDEV(avgZ_l1) as stddev1, count(*) as totalCount  from myProject.dbo.table1

但我不想处理50,000个记录20次(每列一次)。我以为会离开&#39; pivot&#39;将表放在一边并同时处理数据。我已经看到过&#39; Pivot&#39;但他们似乎都在整数类型字段,月号或设备ID上转动。转换表后,我可以用C ++获取每一行。也许这只是'插入...选择......来自&#39;声明。
最快(执行时间)方法是简单地创建一个非常长的select语句,它返回我想要的所有列的所有信息吗? 我们最终可能会有500,000行。我正在使用C ++和SQL 2014。

欢迎任何想法或意见。我只是不想让我的天真代码被用作不做某事的光辉榜样...;)...

1 个答案:

答案 0 :(得分:1)

如果您的表看起来与您在r中发送的代码相同,那么以下查询应该适合您。它会选择您请求的数据并同时对其进行转动。

create table #temp(ID int identity(1,1),columnName nvarchar(50));
insert into #temp 
SELECT COLUMN_NAME as columnName
FROM myProject.INFORMATION_SCHEMA.COLUMNS               -- change myProject to the name of your database. Unless myProject is your database
WHERE TABLE_NAME = N'table1';                           --change table1 to your table that your looking at. Unless table1 is your table
declare @TableName nvarchar(50) = 'table1';             --change table1 to your table again 

declare @loop int = 1;
declare @query nvarchar(max) = '';
declare @columnName nvarchar(50);
declare @endQuery nvarchar(max)='';
while (@loop <= (select count(*) from #temp))
    begin
        set @columnName = (select columnName from #temp where ID = @loop);
        set @query = 'select t.columnName, avg(['+@columnName+']) as Avg ,min(['+@columnName+']) as min ,max(['+@columnName+'])as max ,stdev(['+@columnName+']) as STDEV,count(*) as totalCount from '+@tablename+' join   #temp t on t.columnName = '''+@columnName+''' group by t.columnName';
        set @loop += 1;
        set @endQuery += 'union all('+ @query + ')';
    end;
set @endQuery = stuff(@endQuery,1,9,'')
Execute(@endQuery);
drop table #temp;

它创建一个#temp表,用于存储ID旁边的列标题的值。然后它在循环时通过您拥有的列数使用ID。然后,它会生成一个查询,选择您想要的内容,然后将它们联合起来。此查询将适用于任意数量的列,这意味着如果添加或删除更多列,则应提供正确的结果。

使用此输入:

 age   height_seca1 height_chad1 height_DL weight_alog1
1   19         1800         1797       180           70
2   19         1682         1670       167           69
3   21         1765         1765       178           80
4   21         1829         1833       181           74
5   21         1706         1705       170          103
6   18         1607         1606       160           76
7   19         1578         1576       156           50
8   19         1577         1575       156           61
9   21         1666         1665       166           52
10  17         1710         1716       172           65
11  28         1616         1619       161           66
12  22         1648         1644       165           58
13  19         1569         1570       155           55
14  19         1779         1777       177           55
15  18         1773         1772       179           70
16  18         1816         1809       181           81
17  19         1766         1765       178           77
18  19         1745         1741       174           76
19  18         1716         1714       170           71
20  21         1785         1783       179           64
21  19         1850         1854       185           71
22  31         1875         1880       188           95
23  26         1877         1877       186          106
24  19         1836         1837       185          100
25  18         1825         1823       182           85
26  19         1755         1754       174           79
27  26         1658         1658       165           69
28  20         1816         1818       183           84
29  18         1755         1755       175           67

它将产生此输出:

                    avg     min     max     stdev   totalcount
age                 20      17      31      3.3     29 
height_seca1        1737    1569    1877    91.9    29 
height_chad1        1736    1570    1880    92.7    29 
height_DL           173     155     188     9.7     29 
weight_alog1        73      50      106     14.5    29 

希望这对您有所帮助。 :)