基于另一列的不同值计算数值

5
我需要根据OrderLineNo不同的数量计算有多少个订单行。每个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是否可以实现这一点?

谢谢您的回复。虽然这个方法可行,但它只显示每个订单的总额,而我需要的是完整的总额。 - Crampo
你应该编辑你的问题并添加所需的结果和完整示例,而不是在评论中提问。你不需要展示成百上千个示例,但看到一个包含多个“OrderNo”的示例会很有帮助。此外,如果你是在参考下面的回答,那么请在评论中说明。 - Tim Schmelter
可能是[SQL Server查询 - 使用DISTINCT选择COUNT(*)]的重复问题(https://dev59.com/NnI_5IYBdhLWcg3wHfOr)。 - Tanner
根据您的表逻辑,为什么不只选择最大的OrderLineNo呢? - Tab Alleman
5个回答

3
您可以将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

演示

因此,对于每个OrderNo,其不同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

演示


抱歉,我本意是要在这个上面发表评论。是的,这个可以运行。但它显示了所有订单号及其相应的总数。我该如何让它显示所有订单的完整总数? - Crampo
所以您想要所有不同的OrderLineNo的总和? - Tim Schmelter
是的,所有不同订单行(但在订单号级别上是不同的)的总和。 - Crampo
我编辑了你的SQLFiddle http://sqlfiddle.com/#!6/2fb5a/1 如果你运行它,它会给你7和6(总计= 13),如果你删除“Orderno,”并进行分组,它只会给你7。我需要的是13 :) - Crampo
@Crampo:请看一下。 - Tim Schmelter

0

检查我的答案并根据您的需求进行修改:

SELECT DEVICE,
COUNT(CASE WHEN ANOMALY_SEVERITY = 'Critical' THEN 'Critical' END) as 'Critical', 
COUNT(CASE WHEN ANOMALY_SEVERITY = 'High' THEN 'High' END) as 'High',
COUNT(CASE WHEN ANOMALY_SEVERITY = 'Medium' THEN 'Medium' END) as 'Medium', 
COUNT(CASE WHEN ANOMALY_SEVERITY = 'Low' THEN 'Low' END) as 'Low',
COUNT(CASE WHEN ANOMALY = 'True' THEN 'Total' END) as 'Total'
FROM <table_name> WHERE ANOMALY='True' GROUP BY DEVICE

0

count聚合中使用Distinct

select count(distinct OrderLineNo) as Dist_count
from yourtable

0
一个没有使用去重的解决方案,但是需要两次应用 group by
select orderNo , count(*) from
  (select orderNo from tbl group by orderNo,orderlineNo) t1 group by orderNo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接