根据来自另一列的不同值计算值

Posted

技术标签:

【中文标题】根据来自另一列的不同值计算值【英文标题】:Counting Values based on distinct values from another Column 【发布时间】:2015-07-17 14:28:48 【问题描述】:

我需要根据 orderlineNo 不同来计算有多少个 orderline。每个 OrderNo 不同,但每个订单的 OrderLineNo 相同。 即一个订单有 9 行,那么订单行号将从 1 到 9。如果在另一个订单上有 3 个订单行,它们将从 1 到 3

但在 orderlineno 中可能有相同的订单号 - 为此我只想计算一次

例子:

OrderNo        OrderLineNo
987654             1
987654             2
987654             2
987654             3
987654             4
987654             5
987654             6
987654             7

这里的订单总行数是 7。有两个订单行有 2,我希望它们只计算一次。

这是否可以使用 SQL Server 2014。

【问题讨论】:

您好,感谢您的回复,虽然这有效,但它显示了每个订单的总数,我只需要完整的总数。 您应该编辑它并添加所需的结果和完整的示例,而不是评论您的问题。您不需要显示数百个,但是查看一个包含多个 OrderNo 的内容会很有帮助。另外,如果您指的是我在下面的回答,请改为评论。 SQL Server query - Selecting COUNT(*) with DISTINCT的可能重复 根据你表的逻辑,为什么不直接选择MAX OrderLineNo呢? 【参考方案1】:

您可以将 DISTINCT 添加到 COUNT:

select OrderNo, count(distinct OrderLineNo)
from tab
group by OrderNo;

或者如果 OrderLineNo 总是从 1 开始并且没有间隙地增加:

select OrderNo, max(OrderLineNo)
from tab
group by OrderNo;

编辑:

根据评论,这不是每个 OrderNo 的计数,而是全局计数。您需要使用派生表:

select count(*)
from
 (select distinct OrderNo, OrderLineNo
  from tab
 ) as dt;

select sum(n)
from
 (select OrderNo, max(OrderLineNo) as n
  from tab
  group by OrderNo
 ) as dt;

select sum(Dist_count)
from
 ( select OrderNo,count(distinct OrderLineNo) as Dist_count
   from Table1
   group by OrderNo
 ) as dt

【讨论】:

【参考方案2】:

我猜你想要这个:

SELECT OrderNo, COUNT(distinct OrderLineNo) as CntDistOrderLineNoPerOrderNo
FROM Table1
GROUP BY OrderNo

demo

因此,对于每个 OrderNo,dictinct OrderLineNo 的计数为 7,即 987654。

如果您想要注释的所有不同 OrderLineNo 的总和。

WITH CTE AS
(
  SELECT OrderNo,
         MAX(OrderLineNo) as MaxOrderLineNoPerOrderNo
  FROM Table1
  GROUP BY OrderNo
)
SELECT SUM(MaxOrderLineNoPerOrderNo) AS SumOrderLineNoPerOrderNo
FROM CTE

Demo

【讨论】:

对不起,我想评论这个。是的,这有效,但它显示了所有订单号以及各自的总数。我怎样才能让它显示所有这些的完整总数。 所以你想要所有不同 OrderLineNo 的总和? 是的,所有不同订单行的总和(但在 orderno 级别上不同) 我编辑了您的 SQLFiddle sqlfiddle.com/#!6/2fb5a/1 如果您运行它,如果您删除“Orderno”并分组,它将给您 7 和 6(总计 = 13)。它只会给你 7 个。我需要 13 个 :) @Crampo:看看。【参考方案3】:

count 聚合中使用Distinct

select count(distinct OrderLineNo) as Dist_count
from yourtable

【讨论】:

【参考方案4】:

没有不同的解决方案,但需要两次应用group by

select orderNo , count(*) from
  (select orderNo from tbl group by orderNo,orderlineNo) t1 group by orderNo

【讨论】:

以上是关于根据来自另一列的不同值计算值的主要内容,如果未能解决你的问题,请参考以下文章

具有 1 个不同的列和来自另一列的总和值 [关闭]

根据由另一列分组的不同列的最大值获取值[重复]

如何根据R中另一列的日期(月/日/年)计算列的年/月平均值、最大值、最小值等

SQL Server:选择一列的计数,同时检查另一列中的不同值

在 SQL 中,如何为另一列的每个不同值创建新的值列?

SQL如何查询出某一列中不同值出现的次数?