2016-08-15 3 views
-2

特定のテーブルに対して、単一のレコードセット内の各列の統計モードを返すSQLクエリが必要です。私は集約でこれを行ういくつかの方法を見ていますが、それらはすべて単一の列アプローチです。列があるのと同じくらい多くのクエリを組み合わせることなく、誰もがこれを行う方法を考えることができますか? SQL Serverにはmode()集約はありません。SQL Server - 各列の統計モード

テーブル#xに3つの列がある場合は、3つの列を持つ1つの行が必要です。 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

これにより、Item、Value、およびHitsが動的に生成されます。あなたはピッタリとピボットすることができます。

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の後半になった。早く採用して欲しい。 –