将多行压缩为单行,并根据sqlite中的唯一值进行计数

时间:2014-04-04 20:20:18

标签: database excel sqlite

我正在尝试将每个事件包含多行的表压缩到一个较小的表中,该表包含每个事件中的关键子事件的计数。事件是根据列之间的唯一组合定义的。

作为一个具体的例子,假设我有以下数据,涉及客户在不同日期购买不同商品的各个商店:

cust date   store   item_type
a    1     Main St  1
a    1     Main St  2
a    1     Main St  2
a    1     Main St  2
b    1     Main St  1
b    1     Main St  2
b    1     Main St  2
c    1     Main St  1
d    2     Elm St   1
d    2     Elm St   3
e    2     Main St  1
e    2     Main St  1
a    3     Main St  1
a    3     Main St  2

我想将数据重组为一个表,该表在给定的每一天每次客户访问时包含一行,并具有适当的计数。我试图了解如何使用SQLite将其浓缩为:

Index   cust   date   store     n_items    item1    item2    item3     item4
1         a      1   Main St        4        1        3        0        0
2         b      1   Main St        3        1        2        0        0
3         c      1   Main St        1        1        0        0        0
4         d      2   Elm St         2        1        0        1        0
5         e      2   Main St        2        2        0        0        0
6         a      3   Main St        2        1        1        0        0

我可以在excel中为这个简单的例子做这个(以sumproduct(cutomer * date)开头,如建议here,然后在此列上累积和生成Index,然后countif和countifs生成所需的计数) 。

Excel非常适合为数千行执行此操作,因此我正在寻找使用SQLite的解决方案。

可悲的是,我的SQLite功夫很弱。

我认为this是我找到的最接近的,但我很难理解如何适应它。

当我尝试通过生成唯一索引开始更基本的方法时:

CREATE UNIQUE INDEX ui ON t(cust, date);

我明白了:

Error: indexed columns are not unique

我非常感谢从哪里开始的任何帮助。非常感谢提前!

1 个答案:

答案 0 :(得分:0)

要为每个唯一的列值组合创建一个结果记录,请使用GROUP BY。

该组中的记录数可以使用COUNT。

要计算特定的项类型,请使用类似item_type=x的布尔表达式,它返回0或1,并对组中的所有记录求和:

SELECT cust,
       date,
       store,
       COUNT(*) AS n_items,
       SUM(item_type = 1) AS item1,
       SUM(item_type = 2) AS item2,
       SUM(item_type = 3) AS item3,
       SUM(item_type = 4) AS item4
FROM t
GROUP BY cust,
         date,
         store