【问题标题】:SQL COUNT with condition and without - using JOIN带条件和不带条件的 SQL COUNT - 使用 JOIN
【发布时间】:2020-04-07 09:43:15
【问题描述】:

我的目标类似于下表:

Key      | Count since date X | Count total
1        | 4                  | 28

通过两个简单的选择,我可以获得这个值:(表的键由 3 列组成 [t$ncmp, t$trav, t$seqn])

1. SELECT COUNT(*) FROM  db.table WHERE t$date >= sysdate-2 GROUP BY t$ncmp, t$trav, t$seqn
2. SELECT COUNT(*) FROM  db.table GROUP BY t$ncmp, t$trav, t$seqn

我怎样才能加入这些陈述?

我尝试了什么:

SELECT n.t$trav, COUNT(n.t$trav), m.total FROM db.table n 
LEFT JOIN (SELECT t$ncmp, t$trav, t$seqn, COUNT(*) as total FROM db.table
           GROUP BY t$ncmp, t$trav, t$seqn) m 
ON (n.t$ncmp = m.t$ncmp AND n.t$trav = m.t$trav AND n.t$seqn = m.t$seqn)
WHERE n.t$date >= sysdate-2
GROUP BY n.t$ncmp, n.t$trav, n.t$seqn

我尝试了不同的变体,但总是出现“缺少分组依据”或“未知限定符”之类的错误。 现在这至少会执行,但总数始终为 2。

T$TRAV  COUNT(N.T$TRAV) TOTAL
4       2                   2
29      3                   2
51      1                   2
62      2                   2
16      1                   2
....

如果有关系,我将把它作为一个从 MSSQLSERVER 到 Oracle-DB 的 OPENQUERY 运行。

【问题讨论】:

  • 我会试试GROUP BY n.t$trav, m.total。您通常 GROUP BY 与您选择的列相同,除了那些作为设置函数的参数的列。
  • @jarlh omg 是的,就是这样!谢谢你!有时这是显而易见的事情:D您可以将其发布为答案,我会接受它:D

标签: sql oracle join


【解决方案1】:

我会试试的

GROUP BY n.t$trav, m.total

您通常 GROUP BY 与您 SELECT 相同的列 - 除了那些作为设置函数的参数的列。

【讨论】:

    【解决方案2】:

    我的目标类似于下表:

    如果是这样,您似乎需要条件聚合:

    select key, count(*) as total,
           sum(case when datecol >= date 'xxxx-xx-xx' then 1 else 0 end) as total_since_x
    from t
    group by key;
    

    我不确定这与您的示例查询有何关系。我根本看不出该代码与您的问题之间的关系。

    【讨论】:

    • 这很酷,我用它来摆脱 JOIN 子句。 :D(但无论如何都使用 JOIN 来构建更复杂的语句......):D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 2016-01-11
    相关资源
    最近更新 更多