0

sqlite 内でクロス集計を作成することは可能ですが、関連するカテゴリ/列をハードコーディングするのではなく、実行時に動的に決定することは可能ですか?

次の例を考えると、かなり退屈になる可能性があります...

SELECT 
shop_id,
sum(CASE WHEN product = 'Fiesta' THEN units END) as Fiesta,
sum(CASE WHEN product = 'Focus' THEN units END) as Focus,
sum(CASE WHEN product = 'Puma' THEN units END) as Puma,
sum(units) AS total

FROM sales
GROUP BY shop_id

以前にストアドプロシージャでSQLServerでこれを行うことができたので、同等のものがあるかどうか疑問に思いました。

4

2 に答える 2

1

いいえ、SQLiteではそれを行うことはできません。SQLiteの分析手段には、より重いRDBMSで利用できる多くの便利な機能が欠けているためです。これが対応するチケットですが、保留中のステータスです。

于 2010-05-27T17:17:44.917 に答える
0

古い質問ですが、とにかく: Ruby on Rails でこのようなものを偽造しました。私の目的では、うまく機能します。

  def self.yearstats(attr)
    # Determine number of columns 
    minyear = self.select("strftime('%Y', min(recorded_at)) AS minyear").first.minyear.to_i
    maxyear = self.select("strftime('%Y', max(recorded_at)) AS maxyear").first.maxyear.to_i
    # Stitch SQL query. Use explicit same column name to not confuse Rails' typecasting.
    select_str = ["strftime('#{minyear}/%m/%d %H:%m', recorded_at) AS recorded_at"]
    (minyear..maxyear).to_a.each do |y|
      # avg because the table might have multiple rows per day
      select_str += ["avg(case when strftime('%Y', recorded_at)='#{y}' then #{attr} end) AS value#{y}"]
    end
    self.select(select_str.join(",")).group("strftime('%m/%d', recorded_at)").all.collect {|row|
      [row.recorded_at.utc.to_i*1000] + (minyear..maxyear).to_a.collect { |y| row.send("value#{y}") }
    }
  end

最初の列では、固定の最初の年を使用して (偽の) 日付を使用したことに注意してください。これにより、グラフ作成ルーチンは、日/月の表示だけでなく、「実際の」日付を取得します。これは少し汚れていますが、私の目的には適しています。(改善はまだ歓迎されています...)

と を取得する代わりに、SELECT DISTINCT.. を実行して、カテゴリの一意のリストを取得minyearmaxyear、コードを適切に変更することをお勧めします。

于 2012-10-06T21:14:11.800 に答える