我需要一些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(*))
我希望查询为表中的所有列计算上述值。如果我不清楚或您是否需要更多信息,请告诉我。
答案 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