2017-06-26 9 views
0

ほとんどの契約が成立した年と全年を通じて月を返すことができます。その月に最も多くの契約が行われます。1年およびすべての月で最高の価値を見つける方法

私が試してみた:

SELECT 
    cal.CalendarYear 
    ,cal.MonthOfYear 
    ,COUNT(*) AS Cnt 
FROM dim.Application app 
    JOIN dim.Calendar cal ON app.ApplicationDateID = cal.DateId 
--WHERE (CalendarYear IS NULL) OR (MonthOfYear IS NULL) 
GROUP BY 
    cal.CalendarYear 
    ,cal.MonthOfYear 
WITH CUBE 
ORDER BY COUNT(*) DESC 

と...

--;WITH maxYear AS (
    SELECT TOP 1 
     cal.CalendarYear AS [Year] 
     ,0    AS [Month] 
     ,COUNT(*) AS Cnt 
    FROM dim.Application app 
     JOIN dim.Calendar cal ON app.ApplicationDateID = cal.DateId 
    GROUP BY cal.CalendarYear 
-- ORDER BY COUNT(*) DESC 
--) 
UNION ALL 
--,maxMonth AS (
    SELECT TOP 1 
     0      AS [Year] 
     ,cal.MonthOfYear  AS [Month] 
     ,COUNT(*)    AS Cnt 
    FROM dim.Application app 
     JOIN dim.Calendar cal ON app.ApplicationDateID = cal.DateID 
    GROUP BY cal.MonthOfYear 
    ORDER BY COUNT(*) DESC 
--) 

を任意の助けをいただければ幸いです。ありがとう。

+1

なぜ2番目の解決法は機能しませんか? –

+0

最高値で注文されていないためです。 –

+0

サンプルデータと期待される結果を表示できますか? –

答えて

1

EDIT

year/month cnt 
2017  4 
3   2 

I:

select calendaryear AS 'year/month', cnt from (
SELECT TOP 1 
    cal.CalendarYear 
    ,COUNT(*) AS Cnt 
FROM dim.Application AS app 
    JOIN dim.Calendar AS cal ON app.ApplicationDateID = cal.DateId 
GROUP BY 
    cal.CalendarYear 
ORDER BY COUNT(*) DESC 
) as year 
UNION ALL 
select MonthOfYear, Cnt FROM ( 
SELECT TOP 1 
    cal.CalendarYear 
    ,cal.MonthOfYear 
    ,COUNT(*) AS Cnt 
FROM dim.Application AS app 
    JOIN dim.Calendar AS cal ON app.ApplicationDateID = cal.DateId 
GROUP BY 
    cal.CalendarYear 
    ,cal.MonthOfYear 
ORDER BY COUNT(*) DESC 
) AS month 

それは月に3が実際2016年にある結果、以下の戻り値:これはあなたが単一の行にそれをしない限り、何をしたいかもしれません次のデータを入力として使用しました

create table #calendar (DateId int, calendaryear int, monthofyear int) 
create table #application (applicationdateId int) 

insert into #calendar values (1,2017,01) 
insert into #calendar values (2,2017,02) 
insert into #calendar values (3,2017,03) 
insert into #calendar values (4,2016,01) 
insert into #calendar values (5,2016,03) 

insert into #application values (1) 
insert into #application values (1) 
insert into #application values (2) 
insert into #application values (3) 
insert into #application values (4) 
insert into #application values (5) 
insert into #application values (5) 
+0

はい、私は1つのクエリでそれを必要とします。 私が欲しくないもの:2014-08 7354私が望むもの:2016 86221、11 6854. –

+0

私はそれについて作業します。 –

+0

@StanislavJirák更新されたクエリを参照してください。それはあなたが望むものを与えるはずです。もし私がそれを正しく理解すれば。 –

2

このwil L ORDER BY UNIONの各部分に独立して、まだ結果joined 1でSELECT ...

SELECT x.* FROM (
    SELECT TOP 1 
     cal.CalendarYear AS [Year] 
     ,0    AS [Month] 
     ,COUNT(*) AS Cnt 
    FROM dim.Application app 
     JOIN dim.Calendar cal ON app.ApplicationDateID = cal.DateId 
    GROUP BY cal.CalendarYear 
    ORDER BY COUNT(*) DESC 
) x 

UNION ALL 

SELECT x.* FROM (
    SELECT TOP 1 
     0      AS [Year] 
     ,cal.MonthOfYear  AS [Month] 
     ,COUNT(*)    AS Cnt 
    FROM dim.Application app 
     JOIN dim.Calendar cal ON app.ApplicationDateID = cal.DateID 
    GROUP BY cal.MonthOfYear 
    ORDER BY COUNT(*) DESC 
) x 
2

は年と月あたりのカウント数を取得し、最高の契約で年と月を取得するためにrow_numberを使用しています。

最高カウントとの関連があるときに行う必要があることを指定する必要があります。結び付いているときに最大数の行が必要だと仮定すると、

With ranks as 
     (SELECT T.* 
      ,RANK() OVER(ORDER BY Year_Cnt DESC) as Year_rank 
      ,RANK() OVER(ORDER BY Month_Year_Cnt DESC) as Month_Year_rank 
      FROM (SELECT 
       cal.CalendarYear AS [Year] 
       ,cal.MonthOfYear AS [Month] 
       ,COUNT(*) OVER(PARTITION BY cal.CalendarYear) AS Year_Cnt 
       ,COUNT(*) OVER(PARTITION BY cal.MonthOfYear) AS Month_Year_Cnt 
       FROM dim.Application app 
       JOIN dim.Calendar cal ON app.ApplicationDateID = cal.DateId 
       ) T 
     ) 
SELECT * 
FROM (SELECT DISTINCT Year,Year_Cnt FROM RANKS WHERE Year_rank=1) ry 
CROSS JOIN (SELECT DISTINCT Month,Month_Year_Cnt FROM RANKS WHERE Month_Year_rank=1) rm 
関連する問題