3

私の頭は を使用する (愚かな) 試行から煙を上げておりJOIN、私のかなり一般的なシナリオの解決策を考え出すために-私はそれに頭を包むことができません。すぐに例を挙げましょう。WITHGROUP BY

2 つのテーブル (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 テーブルに結合し、1 か月あたりのすべての色数を合計して、1 か月の合計から各数のパーセンテージを計算することだけです。表は言葉よりも優れています:

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%

09(月の合計カウントは65であるため、66%forPurpleおよび は0存在しない色に注意してください):

誰かが SQL で夢を見ていることを願っています。これは簡単な作業です...

4

2 に答える 2

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
于 2010-11-16T15:51:28.820 に答える
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

そのようなもの....月の先頭のゼロは表示されませんが、それは本当に重要ですか?

于 2010-11-16T15:18:05.490 に答える