0

私はSQLの初心者で、指定された時間範囲と間隔を取得し、間隔でグループ化されたその時間範囲内のデータを返すことを目的としたストアドプロシージャを作成しています。たとえば、2週間の時間範囲と2日の間隔を入力すると、7つのデータポイントのパフォーマンスが得られます。

グループ化を行うために、間隔単位と日付部分のスイッチケースを使用して、グループ化のためにそれを抽出しています。ただし、私のプロシージャはコンパイルされません。これが私のコードです:

declare @interval int
declare @unit varchar(6)

set @interval=1
set @unit='year'

select
    case @unit
        when 'year' then datepart(year, CreateDate)/@interval*@interval
        when 'month' then datepart(month, CreateDate)/@interval*@interval
        when 'week' then datepart(week, CreateDate)/@interval*@interval
        when 'day' then datepart(day, CreateDate)/@interval*@interval
        when 'hour' then datepart(hour, CreateDate)/@interval*@interval
        when 'minute' then datepart(minute, CreateDate)/@interval*@interval
        when 'second' then datepart(second, CreateDate)/@interval*@interval
    end
from OrderInfoCustom
group by
    case @unit
        when 'year' then datepart(year, CreateDate)/@interval
        when 'month' then datepart(month, CreateDate)/@interval
        when 'week' then datepart(week, CreateDate)/@interval
        when 'day' then datepart(day, CreateDate)/@interval
        when 'hour' then datepart(hour, CreateDate)/@interval
        when 'minute' then datepart(minute, CreateDate)/@interval
        when 'second' then datepart(second, CreateDate)/@interval
    end

これはコンパイルを拒否し、このエラーを(複数回)与えます:

メッセージ8120、レベル16、状態1、行7の列'OrderInfoCustom.CreateDate'は、集計関数またはGROUP BY句のいずれにも含まれていないため、選択リストでは無効です。

コンパイラは、CreateDateがswitch-case内にあるため、集計関数の一部であることを認識していないようです。わからない。

編集:私はMicrosoft SQLServer2005を使用していることを含める必要があります。

4

1 に答える 1

1

はい、式でグループ化しているため、その式の一部を選択に使用することはできません。

まったく同じ式を使用すると、次のように機能するはずです。

select
  case @unit
    when 'year' then datepart(year, CreateDate)/@interval
    when 'month' then datepart(month, CreateDate)/@interval
    when 'week' then datepart(week, CreateDate)/@interval
    when 'day' then datepart(day, CreateDate)/@interval
    when 'hour' then datepart(hour, CreateDate)/@interval
    when 'minute' then datepart(minute, CreateDate)/@interval
    when 'second' then datepart(second, CreateDate)/@interval
  end * @interval
from OrderInfoCustom
group by
  case @unit
    when 'year' then datepart(year, CreateDate)/@interval
    when 'month' then datepart(month, CreateDate)/@interval
    when 'week' then datepart(week, CreateDate)/@interval
    when 'day' then datepart(day, CreateDate)/@interval
    when 'hour' then datepart(hour, CreateDate)/@interval
    when 'minute' then datepart(minute, CreateDate)/@interval
    when 'second' then datepart(second, CreateDate)/@interval
  end

サブクエリを使用することもできます。

select y * @interval
from (
  select
    case @unit
      when 'year' then datepart(year, CreateDate)/@interval
      when 'month' then datepart(month, CreateDate)/@interval
      when 'week' then datepart(week, CreateDate)/@interval
      when 'day' then datepart(day, CreateDate)/@interval
      when 'hour' then datepart(hour, CreateDate)/@interval
      when 'minute' then datepart(minute, CreateDate)/@interval
      when 'second' then datepart(second, CreateDate)/@interval
    end as y
  from OrderInfoCustom
) x
group by y
于 2012-07-02T15:51:51.230 に答える