Динамически создавать категории для сводной / перекрестной таблицы SQLite - PullRequest
0 голосов
/ 27 мая 2010

Я понимаю, что можно создать кросс-таблицу в 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 в хранимой процедуре раньше, и я подумал, есть ли что-нибудь эквивалентное.

Ответы [ 2 ]

1 голос
/ 27 мая 2010

Нет, вы не можете сделать это в SQLite, поскольку аналитические средства в SQLite не имеют многих полезных функций , доступных в более тяжелых СУБД. Здесь - соответствующий тикет, но он находится в состоянии ожидания.

0 голосов
/ 07 октября 2012

Старый вопрос, но в любом случае: я подделал что-то подобное в 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

Обратите внимание, что для первого столбца я использовал (фальшивую) дату, используя фиксированный первый год, чтобы мои подпрограммы построения графиков получали «реальную» дату, а не только день / месяц. Это немного грязно, но это работает для моих целей. (Улучшения все еще приветствуются ...)

Вместо получения minyear и maxyear вы можете выполнить команду SELECT DISTINCT .., чтобы получить уникальный список категорий и соответствующим образом изменить код.

...