2010-11-16 82 views
3

我的頭正在吸(愚蠢)嘗試使用JOIN,WITHGROUP BY爲我的相當常見的情況提出了一個解決方案 - 我只是無法環繞它。讓我在你扔的例子馬上:SQL每月加入和每月總計百分比

我有兩個表(ColorCount和Colorname):

ColorCount: 
ColorID Count Date 
1  42 2010-09-07 
1  1  2010-09-08 
2  22 2010-09-14 
1  20 2010-10-10 
3  4  2010-10-14 

ColorName: 
ColorID Name 
1  Purple 
2  Green 
3  Yellow 
4  Red 

現在,我要的是加入ColorName表到ColorCount表格,將每月的所有顏色計數加起來,並計算每月總計的每個計數的百分比。表是勝於言:

Output: 
Month Color Count Percentage 
09 Purple 43 66% 
09 Green 22 33% 
09 Yellow 0  0% 
09 Red  0  0% 
10 Purple 20 83% 
10 Green 0  0% 
10 Yellow 4  16% 
10 Red  0  0% 

(請注意,每月的總數0965,因此66%Purple,也是0的爲不存在的顏色):

我希望有人夢想在SQL,這是一件容易的事......

回答

3

這工作,有以下注意事項:

  • 日期時間值必須是迄今爲止,只有
  • 只列出那些個月其上有任何數據
  • 我列出了每月的第一天,以防萬一您的數據跨越多年(假設您不想從2009年1月起彙總數據與2010年1月的數據)
  • 準確的百分比列格式詳細信息我留給你,我必須回來上班

代碼:

;with cte (ColorId, Mth, TotalCount) 
as (select 
     ColorId 
     ,dateadd(dd, -datepart(dd, Date) + 1, Date) Mth 
     ,sum(Count) TotalCount 
     from ColorCount 
     group by ColorId, dateadd(dd, -datepart(dd, Date) + 1, Date)) 
select 
    AllMonths.Mth [Month] 
    ,cn.Name 
    ,isnull(AggData.TotalCount, 0) [Count] 
    ,isnull(100 * AggData.TotalCount/sum(AggData.TotalCount * 1.00) over (partition by AllMonths.Mth), 0) Percentage 
    from (select distinct Mth from cte) AllMonths 
    cross join ColorName cn 
    left outer join cte AggData 
    on AggData.ColorId = cn.ColorId 
    and AggData.Mth = AllMonths.Mth 
    order by AllMonths.Mth, cn.ColorId 
+0

分區的使用。太好了! – 2010-11-16 16:01:22

+0

是的,很好。必須得到一本關於MSSQL 2008的好書 – AlexanderMP 2010-11-16 16:20:43

+0

關於SimpleTalk的開窗技術的很好的討論,請訪問http://www.simple-talk.com/sql/learn-sql-server/working-with-window-functions-in-sql-服務器/?utm_source = simpletalk&utm_medium =電子郵件的主&=的utm_content WindowsFunction-20101101&utm_campaign = SQL – 2010-11-16 18:42:43

2
SELECT 
    [Month], 
    [Name], 
    [Count], 
    CASE WHEN TotalMonth=0 THEN 'INF' ELSE cast(round([Count],0)*100.0/TotalMonth,0) as int) + '%' END as [Percentage] 
FROM 
(
SELECT 
    [Months].[Month] as [Month], 
    CN.[Name], 
    isnull(CC.[Count],0) as [Count], 
    (SELECT SUM([Count]) FROM ColorCount WHERE 
      datepart(month,[Date])=datepart(month,CC.[Date]) 
    ) as [TotalMonth] 
FROM (SELECT DISTINCT datepart(month,[Date]) as [Month] FROM ColorCount) [Months] 
LEFT JOIN ColorName CN ON [Months].[Month]=datepart(month,CC.[Date]) 
LEFT JOIN ColorCount CC ON CN.ColorID=CC.ColorID 
) AS tbl1 
ORDER BY 
    [Month] ASC, 
    [Name] ASC 

類似的東西.... 它不會顯示月份的前導零,但它真的很重要嗎?

+0

很好的嘗試,但百分比關閉。 – 2010-11-16 15:25:21

+0

更好,但你應該轉換爲浮動以避免舍入錯誤。 – 2010-11-16 15:28:32

+0

它也可以通過零異常產生除法,但爲了避免這種情況,只需要很多打字。我會盡力整理出來。百分比呢?爲什麼關閉? – AlexanderMP 2010-11-16 15:32:13