【问题标题】:SQL: Count distinct column combinations with multiple conditionsSQL:计算具有多个条件的不同列组合
【发布时间】:2021-02-24 18:26:40
【问题描述】:

我有一个如下所示的连接表,其中 mytable 包含日期、storeid、item 和 units,而 stores 具有 state 和 storeid。

date         state      storeid   item   units
==============================================
2020-01-22   new york   712       a      5
2020-01-22   new york   712       b      7
2020-02-18   new york   712       c      0
2020-05-11   new york   518       b      9
2020-01-22   new york   518       b      10
2020-01-21   oregon     613       b      0
2020-02-13   oregon     613       b      9
2020-04-30   oregon     613       b      10
2020-01-22   oregon     515       c      3

我正在尝试创建一个列来计算 storeiditemdate 的行中出现的唯一次数> 介于给定日期范围内且 units 大于 0。另外,只需按 state 和计算列进行选择/分组。我有一些看起来像这样的东西:

select
    s.state,
    count(distinct case
        when m.date between '2020-01-01' and '2020-03-31'
        and m.units > 0
        then m.storeid, m.item
    end) as q1_total
    from mytable as m
        left join (select
            state,
            storeid
        from stores) s
        on m.storeid=s.storeid
group by s.state

我知道我的计数函数没有正确编写,但我不确定如何修复它。试图让最终结果看起来像这样。

state         q1total 
=========================
new york      3
oregon        2

【问题讨论】:

  • 你用的是什么数据库?
  • 在 sql server 中执行此操作。此外,编辑以上内容以将表名添加为“mytable”。感谢举报。

标签: sql sql-server count distinct


【解决方案1】:

使用此查询:

select distinct state, storeid, item
from mytable
where date between '2020-01-01' and '2020-03-31' and units > 0

您可以根据自己的条件获得 state、storeid 和 item 的所有不同组合,并且可以对其进行聚合:

select state, count(*) q1total
from (
  select distinct state, storeid, item
  from mytable
  where date between '2020-01-01' and '2020-03-31' and units > 0
) t
group by state

请参阅demo
结果:

> state    | q1total
> :------- | ------:
> new york |       3
> oregon   |       2

【讨论】:

  • 抱歉,我应该澄清一下这个表格视图是基于一个连接的。上面编辑。我认为你所拥有的是正确的,但不知道如何调整它。编辑了上面的问题以显示它是如何从两个表中连接起来的。
  • 将子查询的 FROM 子句改为:FROM (<your query here>) t。也许它可以在不嵌套查询的情况下完成,但我无法确定,因为我没有它。
  • 或者在我的查询顶部创建一个 CTE:WITH mytable AS (<your query here>)
  • CTE 解决方案为我创造了奇迹。非常感谢您的补充!
猜你喜欢
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多