根据来自另一列的不同值计算值
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
【讨论】:
以上是关于根据来自另一列的不同值计算值的主要内容,如果未能解决你的问题,请参考以下文章
如何根据R中另一列的日期(月/日/年)计算列的年/月平均值、最大值、最小值等