如何在表的每列中获取最多出现的值

时间:2014-06-18 17:04:25

标签: sql sql-server sql-server-2008 tsql

我需要一些t-sql的帮助,我是SQL脚本的新手。

我有一张70多列的表,它是一个数据仓库。来自Feed的一些值是未知值。例如:如果日期值未知,则为19000101和emailkey = -1,而默认值可能为NULL。

我需要编写一个检索以下信息的脚本

第1列=列的名称[可以对其进行硬编码或从临时表中检索]

第2列=具有最高出现频率的值。 [它可以是NULL,默认值或其他一些有效值]。它将是以下查询的结果:SELECT top 1 HotelKey AS计数值来自dbo.factBooking GROUP by HotelKey ORDER by count(*)desc

第3列=最常出现的值的计数]。它将是以下查询的结果:SELECT top 1 count()AS计数值来自dbo.factBooking GROUP by HotelKey ORDER by count()desc

第4列=这应显示第3列与总计数的百分比]。它将是以下查询的结果:(从dbo.factBooking GROUP中选择前1个计数()由HotelKey ORDER by count()desc)/(来自dbo.factBooking的SELECT count(*))

我希望查询为表中的所有列计算上述值。如果我不清楚或您是否需要更多信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

我使用以下查询生成数据并且工作正常:

使用[数据库名称]

DROP TABLE #tempcol

DROP TABLE #tempbigquery

CREATE table #tempbigquery(sqlquery varchar(max));

从syscolumns中选择ColID,Name as ColName到#tempcol,其中id = object_id('factFlights')ORDER BY colid ASC 声明@Counter integer = 1,@ Calcount Integer =(从#tempcol中选择count()),@ RowCount decimal(18,2)=(从dbo.factFlights中选择count()) 声明@colName Varchar(100),@ sqlquery NVarchar(max)='' 而@Counter< @ ColCount + 3 开始

   Set @colName  =  (Select ColName from #tempcol where ColID = @Counter)
      if @colName IS not NULL
   Set @sqlquery  =  ISNULL('SELECT ColumnName,ColumnKey,CountValue,[Percent] FROM ( SELECT TOP 1 ' + Char(39) + @colName + char(39) + ' ColumnName,' + 'CAST(' + @colName + ' AS varchar(max))' + ' As ColumnKey,COUNT(*) AS CountValue,(COUNT(*) * 100.00) / ' + Cast( @RowCount   As Nvarchar(100)) + '  As [Percent] from dbo.factFlights GROUP by ' +  @colName + ' ORDER by count(*) desc ) As  ' + @colName + '_info  UNION  ' +   char(13),'')
      --Print @sqlquery
   Set @Counter  = @Counter + 1
      INSERT into #tempbigquery (sqlquery) VALUES (@sqlquery)

结束

SELECT * FROM #tempbigquery