如何为没有销售的商店获得零观察的时间表

时间:2017-06-09 09:58:39

标签: sql postgresql

我想要创建一个表的问题。 我有一张桌子,用于商店销售的每一天每家商店的累计销售额。这意味着如果商店在特定日期没有销售,那么这个观察就没有了。

我想要的是每天每家商店的一条线,也就是商店没有任何销售的日子,在这种情况下,每日销售额只有零。

我尝试在每日generate_series和上面提到的表之间进行完全外连接。

void CPictureCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if (mBIsPicLoaded)  {
    RECT rc;
    this->GetClientRect(&rc);
    INT width = (INT) rc.right - rc.left;
    INT height = (INT)(rc.bottom - rc.top);

    Graphics graphics(lpDrawItemStruct->hDC);
    Image image(mPstream);
    graphics.DrawImage(&image, (INT)rc.left, (INT)rc.top, width, height);
}

但如果商店没有任何销售,这不会给我一排零。 希望你们能帮助我。谢谢!

2 个答案:

答案 0 :(得分:0)

您确定表date中的列revenueDATE类型

吗?

我修改了你的查询,试试这个:

select
    timeline::date as date,
    store_rev.store_name,
    store_rev.store_daily_rev
from
(
    select
    timeline::date as date
    from
    generate_series('2017-03-01', now(),'1 day') AS timeline
) timeline
JOIN(select
     r.date,
     r.store_name,
     r.store_daily_rev,
     FROM revenue r) store_rev ON timeline.date::date = store_rev.date::date;

答案 1 :(得分:0)

我认为您希望cross join后跟left join。这将获得所有组合:

select timeline.date, s.store_name,
       coalesce(r.store_daily_rev, 0) as store_daily_rev
from generate_series('2017-03-01', now(), '1 day') as timeline(date) cross join
     (select distinct r.store_name from revenue r) s left join
     revenue r
     on r.store_name = s.store_name and r.date = timeline.date;

cross join生成所有行(日期和商店的组合)。 left join会为拥有它们的商店/日期带来收入值。