SQLを使用してExcel のモード関数を複製するにはどうすればよいですか?
Excel で一連の数値に対してモード関数を実行すると、複数のモード値があっても 1 つのモード値が返されます。同じように機能するには、いくつかのSQLが必要です。
この一連の数値に対して、Excel はモード 8 を返します。これはおそらく、8 が最初に表示されるモーダル数値であるためです。
6
7
8
3
3
8
0
2
2
モードの例がない場合は、すべての数値が一意であり、NA を返す必要があります。
これは私がこれまでに持っているコードです。
SQLを使用してExcel のモード関数を複製するにはどうすればよいですか? Excel で一連の数値に対してモード関数を実行すると、複数のモード値があっても 1 つのモード値が返されます。同じように機能するには、いくつかのSQLが必要です。
これは私がこれまでに持っているものです。occurences=1
モードなしでシリーズを処理する行を削除します。
--I wanted to use CTE for Mode, but it won't work as part of a union query
select RIC,Period,InputFile,Occurrences,amount into #Mode1 from
(SELECT aa.RIC,aa.Period,aa.inputfile,aa.amount,COUNT(*) AS occurrences
FROM tempPivotTable aa
--where aa.ric='USTRDAP' and aa.period='2006' and aa.inputfile='C:\FalconIngest\Input\US April 2006.xls'
GROUP BY aa.RIC,aa.Period,aa.inputfile,aa.amount) as A
Select RIC,vendor,Period,Filedate,inputfile,YearlyOrQuarterly,sortablePeriod,NumericFiledate,MaxAmount into #Mode2 from
(
select t.Ric,'O' as vendor,t.Period,Filedate,t.inputfile,YearlyOrQuarterly,sortablePeriod,NumericFiledate,max(occurrences) as MaxAmount
from TempPivotTable t
inner join #Mode1 A
on t.ric=a.ric and t.period=a.period and t.inputfile=a.inputfile
group by t.Ric,t.Period,Filedate,t.inputfile,YearlyOrQuarterly,sortablePeriod,NumericFiledate
)as A
Select RIC,vendor,Period,Filedate,inputfile,YearlyOrQuarterly,sortablePeriod,NumericFiledate,Amount,occurrences into #Mode3 from
(
select a.RIC, 'O' as vendor,a.period,Filedate,a.inputfile,YearlyOrQuarterly,sortablePeriod,NumericFiledate,Amount,occurrences
from #Mode1 A
inner join #Mode2 M
on A.ric=M.ric and A.period=M.period and A.inputfile=M.Inputfile
where occurrences=maxamount
) as A
--deal with cases where there is no mode
select ric,vendor,period,Filedate,inputfile,YearlyOrQuarterly,sortablePeriod,NumericFiledate,Amount
into #mode4
from(
select ric,'O' as vendor,period,Filedate,inputfile,YearlyOrQuarterly,sortablePeriod,NumericFiledate,0 as Amount from #mode3
where occurrences=1
group by ric,period,Filedate,inputfile,YearlyOrQuarterly,sortablePeriod,NumericFiledate
having count(*)>1
) as A
delete from #mode3 where occurrences=1
select a.RIC, 'O' as vendor,a.period,Filedate,a.inputfile,YearlyOrQuarterly,sortablePeriod,NumericFiledate,Amount
from #Mode1 A
inner join #Mode2 M
on A.ric=M.ric and A.period=M.period and A.inputfile=M.Inputfile
where occurrences=maxamount and maxamount>1
union select * from #mode4 --Put series with no mode as NA
drop table #mode1
drop table #mode2
drop table #mode3
drop table #mode4
その後、この単純化されたコードを思いつきました。
select Code,inputfile,period,Amount,count(*) as Amountcount,
Ranking=dense_Rank() over (partition by Code,period,inputfile order by count(*) desc)
from TempPivotTable
group by Code,inputfile,period,Amountmore of those amount is the modal amount.
モード値が 1 つあれば OK です。以下の例では、3 と 8 がモード値です。複数のモード値がある場合は、ベンダーのアルファベット順リストで最初に表示される 8 を選択する必要があります。
ベンダー 金額 A 6 B 7 C 8 D 3 E 3 F 8 G 0 H 2 I 2