2016-08-15 82 views
-2

對於給定的表,我想要一個SQL查詢,它返回單個記錄集中每列的統計模式。我看到了幾種使用聚合的方法,但它們都是單列方法。任何人都可以想出一種方法來做到這一點,而不需要像列上那樣查詢儘可能多的查詢的聯合? SQL Server中沒有mode()聚合。SQL Server - 每列的統計模式

如果表#x有3列,我想單行3列。這裏是一個使用SQL Server的例子。這是一個繁重的工作,非常適合桌子的定義。我正在尋找更清潔,更普遍的方法。我可能想在不同的時間在不同的桌子上做這個。

create table #x (name varchar(20), age int, city varchar(20)) 
insert into #x values ('Bill', 20, 'NYC') 
insert into #x values ('Bill', 15, 'NYC') 
insert into #x values ('Mary', 29, 'LA') 
insert into #x values ('Bill', 30, 'NYC') 
insert into #x values ('Bill', 30, 'NYC') 
insert into #x values ('Bill', 20, 'LA') 
insert into #x values ('Mary', 20, 'NYC') 
insert into #x values ('Joe', 12, 'NYC') 
insert into #x values ('Fred', 55, 'NYC') 
insert into #x values ('Alex', 41, 'NYC') 
insert into #x values ('Alex', 30, 'LA') 
insert into #x values ('Alex', 10, 'Chicago') 
insert into #x values ('Bill', 20, 'NYC') 
insert into #x values ('Bill', 10, 'NYC') 

create table #modes (_column varchar(20), _count int, _mode varchar(20)) 
insert into #modes select top 1 'name' _column, count(*) _count, name _mode from #x group by name order by 2 desc 
insert into #modes select top 1 'age' _column, count(*) _count, age _mode from #x group by age order by 2 desc 
insert into #modes select top 1 'city' _column, count(*) _count, city _mode from #x group by city order by 2 desc 

select name, age, city from (select _mode, _column from #modes) m 
pivot (max(_mode) for _column in (name, age, city)) p 
+0

能否請您用一些示例數據和後期預期的結果 – TheGameiswar

+0

與榜樣,所需的輸出更新說明。 – bvy

回答

0

這將動態生成項目,值和命中。您可以根據需要進行調整。

Declare @YourTable table (name varchar(20), age int, city varchar(20)) 
Insert Into @YourTable values 
('Bill', 20, 'NYC'), 
('Bill', 15, 'NYC'), 
('Mary', 29, 'LA'), 
('Bill', 30, 'NYC'), 
('Bill', 30, 'NYC'), 
('Bill', 20, 'LA'), 
('Mary', 20, 'NYC'), 
('Joe', 12, 'NYC'), 
('Fred', 55, 'NYC'), 
('Alex', 41, 'NYC'), 
('Alex', 30, 'LA'), 
('Alex', 10, 'Chicago'), 
('Bill', 20, 'NYC'), 
('Bill', 10, 'NYC') 

Declare @XML xml 
Set @XML = (Select * from @YourTable for XML RAW) 

Select Item,Value,Hits 
From (
     Select Item,Value,Hits=count(*),RowNr = ROW_NUMBER() over (Partition By Item Order By Count(*) Desc) 
     From (
       Select ID = r.value('@id','int')       -- Usually Reserved 
         ,Item = Attr.value('local-name(.)','varchar(100)') 
         ,Value = Attr.value('.','varchar(max)') 
       From @XML.nodes('/row') as A(r) 
       Cross Apply A.r.nodes('./@*[local-name(.)!="id"]') as B(Attr) 
      ) A 
     Group By Item,Value 
    ) A 
Where RowNr=1 

返回

Item Value Hits 
age  20  4 
city NYC  10 
name Bill 7 
+0

開箱即用,因爲它使用了我不熟悉的XML數據類型。但它似乎與任何你扔在桌上的表一起工作。謝謝。 – bvy

+0

@bvy這是他們的想法。我是一個懶惰的編碼器,我寧願寫一些東西,讓它服務器多個主人。我是XML的後來者。我希望我早些時候通過它。 –