动态创建SQLite透视/交叉表的类别

动态创建SQLite透视/交叉表的类别,sqlite,pivot,crosstab,Sqlite,Pivot,Crosstab,我意识到在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 u

我意识到在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中成功地做到了这一点,我想知道是否有类似的东西

不,在SQLite中不能这样做,因为SQLite中的分析方法在较重的RDBMS中缺乏可用性。是对应的票证,但它处于挂起状态。

老问题,但无论如何:我在Ruby on Rails中伪造了类似的东西。就我而言,它工作得很好

def self.yearstats(attr)
#确定列数
minyear=self。选择(“strftime('%Y',min(记录在))作为minyear”)。first.minyear.to_i
maxyear=self.select(“strftime('%Y',max(记录在))作为maxyear”).first.maxyear.to_i
#缝合SQL查询。使用显式的相同列名以避免混淆Rails的类型转换。
选择_str=[“strftime('#{minyear}/%m/%d%H:%m',recorded_at)作为recorded_at”]
(明年..明年..明年|
#因为该表每天可能有多行
选择_str+=[“当strftime('%Y',recorded_at)='#{Y}然后#{attr}结束时的平均值(case when strftime('%Y',recorded_at)='#{Y}作为值#{Y}]
结束
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}”)}
}
结束
注意,对于第一列,我使用了一个(假)日期,使用固定的第一年,这样我的绘图例程就可以得到一个“真实”的日期,而不仅仅是日/月的显示。这有点脏,但对我来说很管用。(仍欢迎改进…)


您可能不需要获取
minyear
maxyear
,而需要执行一个SELECT DISTINCT。。获取类别的唯一列表并适当修改代码。

确定。谢谢你。很奇怪,像MS Access这样的东西拥有它,但要在其他数据库中真正获得同等的功能却非常困难。