分组依据 return 多个不同的分组结果 SQL 服务器

Group By to return multiple different grouped results SQL Server

我认为这不会太粗糙,尽管我在提出的问题和回答的问题中没有看到它。

我正在寻找一种方法来针对两种不同类型的销售按销售人员进行分组。

所以像

Name PendingORders CompletedOrders TotalOrders

首先按名称分组,计数类型 = P,计数 = C,然后求和类型 = P 和计数 = C。

虽然此报告中只有两种类型的订单,但从技术上讲,标准只是按名称计算所有订单的数量。

我的 table,看起来像这样

Name|Order#|Type
Jane| 1    | C
Jane| 2    | P
Jane| 3    | P
Fred| 4    | P
Fred| 5    | P

希望查询会产生

Name|TotalOrder|Pending|Completed 
Jane|3         |2      |1
Fred|2         |2      |0

非常感谢

使用Conditional Aggregate

select Name
       TotalOrder = count(Name),
       Completed = count(case when type = 'C' then 1 end),
       PENDING = count(case when type = 'P' then 1 end)
From yourtable
group by Name

或使用Pivot

SELECT Name,
       TotalOrder,
       Completed = C,
       PENDING = P
FROM   (SELECT *,
               TotalOrder=Count(1)OVER(partition BY name)
        FROM   Yourtable) a
       PIVOT (Max(order#)
             FOR type IN ([C],
                          [P]))pv 

所以您基本上只是按销售人员分组并为每个销售人员计算三个不同的聚合。这非常简单:

SELECT
  Name,
  count(*) AS TotalOrder,
  SUM(CASE Type WHEN 'P' THEN 1 ELSE 0 END) AS Pending,
  SUM(CASE Type WHEN 'C' THEN 1 ELSE 0 END) AS Completed,
FROM orders
GROUP BY name;

我使用临时表解决了你的问题。您必须使用条件(CASE WHEN)语句来计算数学然后按名称分组。

CREATE TABLE #Orders (
Name VARCHAR(25) NULL , 
OrderNumber INT NULL , 
OrderType CHAR(1) NULL )



INSERT INTO #Orders (Name, OrderNumber , OrderType)
    VALUES ( 'Jane' , 1 , 'C') , 
           ( 'Jane' , 2 , 'P') , 
           ( 'Jane' , 3 , 'P') , 
           ( 'Fred' , 4 , 'P') , 
           ( 'Fred' , 5 , 'P') 



 SELECT Name , 
        COUNT(*) AS TotalOrder , 
        SUM(CASE OrderType WHEN 'P' THEN 1 ELSE 0 END) AS Pending , 
        SUM(CASE OrderType WHEN 'C' THEN 1 ELSE 0 END) AS Completed  
   FROM #Orders
  GROUP BY Name 

 DROP TABLE #Orders