Sql 查询订单详细信息时获取特定类别下的订单总数

Sql 查询订单详细信息时获取特定类别下的订单总数,sql,sql-server-2008,Sql,Sql Server 2008,我有一个orders表,其中包含order detail和名为Category的列,其中Category是订单的类型 现在,客户可以搜索订单详细信息 现在我要写的是一个查询,显示订单详细信息和一个名为TotalOrder的列,该列将显示所有客户针对该类别下的TotalOrders 例如,将订单表设置为 OrderID CustomerID OrderDetails Category 1 1 test A1 2 1

我有一个orders表,其中包含order detail和名为Category的列,其中Category是订单的类型

现在,客户可以搜索订单详细信息

现在我要写的是一个查询,显示订单详细信息和一个名为TotalOrder的列,该列将显示所有客户针对该类别下的TotalOrders

例如,将订单表设置为

OrderID  CustomerID  OrderDetails Category   
1         1           test         A1
2         1           test1        A2
3         2           test3        A2
4         3           test4        A2
因此,如果查询订单id 1

它的结果与订单ID 2类似

OrderID   Cust_ID     OrderDetails  Category      TotalOrdersInThisCategory
2         1           test          A2            3     
此场景演示了实际问题

我怎样才能做到这一点

我是否需要使用GROUPBYCATEGORY子句在一个查询和另一个查询中获取订单详细信息,然后进行内部联接。任何更好的想法都是值得欣赏的

订单详细信息将有数百万条记录

请建议这个问题的更好的标题

谢谢你的帮助

SELECT 
  OrderID,
  Cust_ID,
  OrderDetails,
  Category,
  (select count(*) from orders where category = o.category) TotalOrdersInThisCategory  
FROM
  Orders o
或者你可以试试这个:

SELECT 
  o.OrderID,
  o.Cust_ID,
  o.OrderDetails,
  o.Category,
  c.TotalOrdersInThisCategory  
FROM
  Orders o
INNER JOIN (select category, count(*) from orders group by category) c
        ON o.Category = c.Category

您可以尝试一下,看看它是否运行得更好:

SELECT *
FROM (  SELECT *, COUNT(*) OVER(PARTITION BY Category) TotalOrdersInThisCategory
        FROM OrderTable) A
WHERE OrderId = 2

我不明白你的例子,你说的是OrderId 2,但把OrderdId 1的细节和3个总数放在A1类上,应该只有1…@Lamak真的很抱歉,错误地写了A1而不是A2。我已经通过违反Dry原则解决了这个问题,因为我首先创建了一个CTE,使用Group by Category,然后与查询进行内部连接,请提供一些更好的示例。我的orders表有数千万条记录,因此如果我尝试搜索几百条订单,这段代码将对性能产生很大影响。因此,这对于生产目的可能没有用处。或者你怎么想?最好的方法是分析几种方法,看看你的平台最喜欢哪一种。我在我的原始答案中增加了另一种方法。实际上,第二种方法比第一种更好,但我用同样的方法,只是用CTE代替了按类别c从订单组中选择类别、计数*。但是速度上没有差别,但是感谢postno,按类别totalorders进行的SELECT、COUNT超额分配从OrderTable中选择该类别本身花费了太多的时间,因为OrderTable有大量的数据。