【问题标题】:Return sum(column) == 0 rows in join and group by query返回 sum(column) == 0 行在 join 和 group by 查询
【发布时间】:2021-04-04 22:29:23
【问题描述】:

我有一个具有以下架构的表:

CREATE TABLE transaction_tbl (
    _id INTEGER PRIMARY KEY,
    date TEXT NOT NULL,
    category INTEGER NOT NULL,
    amount REAL NOT NULL,  
    FOREIGN KEY(category) REFERENCES category_tbl(_id)
);

我希望能够选择类别和按周分组(基于date),并包括没有为该类别进行交易的周。

通过以下内容,我可以看到任何类别下的一些交易都存在相关的周数:

sqlite> select distinct strftime('%Y/%W',replace(date,'/','-')) as span from transaction_tbl;
span
<snip>
2020/37
2020/38
2020/39
2020/40
2020/41
<snip>

但是,当使用它作为一个临时表来左连接时,“2020/39”周不会显示:

sqlite> with spans as (select distinct strftime('%Y/%W',replace(date,'/','-')) as span from transaction_tbl)  select span, category, sum(coalesce(amount, 0)) as sum from spans left join transaction_tbl tt on span=strftime('%Y/%W',replace(date,'/','-')) where category in (13) group by span, category;
span|category|sum
<snip>
2020/37|13|XXX
2020/38|13|XXX
               <-- This '2020/29|13|0' row should appear but does not
2020/40|13|XXX
2020/41|13|XXX
<snip>

只是一个例子,我的 .sqlite_history 文件有很多不工作的例子......

如果找到其他一些 SO 问题,它看起来像左连接的右表中的空行,包括临时表应该包含但它似乎不适用于我。由于我无法锻炼的原因。​​

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    首先,在您的查询中,您没有进行任何聚合。
    我假设您想要sum(amount) 而不仅仅是amount
    此外,您必须在ON 子句中设置条件tt.category in (13) 或仅设置tt.category = 13 并删除WHERE 子句,因为WHERE 子句会删除所有不匹配的行并将连接转换为INNER 连接:

    with spans as (
      select distinct strftime('%Y/%W',replace(date,'/','-')) as span 
      from transaction_tbl
    )  
    select s.span, tt.category, coalesce(sum(tt.amount), 0) as sum 
    from spans s left join transaction_tbl tt 
    on ss.span = strftime('%Y/%W', replace(tt.date, '/' , '-')) and tt.category in (13) 
    group by s.span, tt.category;
    

    【讨论】:

    • 是的,当然总和应该包括sum(...),是的,将类别选择移动到连接工作 - 它给出了2020/39||0,我认为它足够接近我可以使用它。干杯。
    猜你喜欢
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多