SQL 按客户位置分组
SQL Group by Client Location
我正在尝试操作的数据示例
Order | OrderDate | ClientName| ClientAddress | City | State| Zip |
-------|-----------|-----------|---------------|--------|------|-------|
CO101 | 1/5/2015 | Client ABC| 101 Park Drive| Boston | MA | 02134 |
C0102 | 2/6/2015 | Client ABC| 101 Park Drive| Boston | MA | 02134 |
C0103 | 1/7/2015 | Client ABC| 354 Foo Pkwy | Dallas | TX | 75001 |
C0104 | 3/7/2015 | Client ABC| 354 Foo Pkwy | Dallas | TX | 75001 |
C0105 | 5/7/2015 | Client XYZ| 1 Binary Road | Austin | TX | 73301 |
C0106 | 1/8/2015 | Client XYZ| 1 Binary Road | Austin | TX | 73301 |
C0107 | 7/9/2015 | Client XYZ| 51 Testing Rd | Austin | TX | 73301 |
我在 MS-SQL 服务器中设置了一个数据库,其中包含过去两年的所有客户订单。有些客户只有一个地点,有些则有多个地点。我想编写一个脚本,显示客户在至少有一个订单的总周数内按地点下的订单数量。
根据此脚本的结果,我希望能够推断出每个客户位置的独特订单(在不同时间下达)的摘要。例如:
- 客户 ABC 在地点 A 总共 35 周内下了 45 个订单
- 客户 ABC 在地点 B 总共 15 周内下了 35 个订单
- 客户 ABC 在地点 C 总共 15 周内下了 15 个订单
我想为每个客户的每个唯一位置查看此信息。我不确定如何以这种方式聚合数据。这是我的脚本所在的位置:
SELECT t1.ClientName, (SELECT DISTINCT t2.ClientAddress), COUNT(DISTINCT t2.Orders) AS TotalOrders,
DATEPART(week, t1.OrderDate) AS Week
FROM database t1
INNER JOIN database t2 on t1.Orders = t2.Orders
GROUP BY DATEPART(week, t1.OrderDate), t1.ClientAddress, t2.ClientAddress
HAVING COUNT(DISTINCT t2.SalesOrder) > 1
ORDER BY TotalOrders DESC
我得到的结果按周向我展示了按位置分类的唯一订单,但我不确定如何以我需要的方式计算周数;我曾尝试编写子查询,但我将 运行 放入问题中。我意识到在这个脚本中,我显示了每个星期按位置显示的订单数量,我想计算至少有一个订单的时间范围内的总周数。
结果结构如下:
| ClientName| ClientAddress | TotalOrders | Week |
|-----------|---------------|--------------|------|
|Client ABC |101 Park Drive | 30 | 21 |
|Client ABC |101 Park Drive | 29 | 13 |
|Client ABC |101 Park Drive | 28 | 10 |
|Client XYZ |1 Binary Road | 27 | 19 |
|Client XYZ |1 Binary Road | 25 | 7 |
|Client XYZ |51 Testing Rd | 22 | 9 |
任何帮助将不胜感激;提前谢谢你。
这不就是你想要的吗?
SELECT t1.ClientName, ClientAddress, COUNT(DISTINCT t1.Orders) AS TotalOrders,
COUNT(DISTINCT DATEPART(week, t1.OrderDate)) AS Weeks
FROM database t1
GROUP BY t1.ClientName, t1.ClientAddress
HAVING COUNT(DISTINCT t2.SalesOrder) > 1
ORDER BY TotalOrders DESC
我不太明白你为什么要进行自我加入。对我来说似乎没用,但我把它留在里面,以防万一,并且只关注我为获得您的结果所做的更改。
我正在尝试操作的数据示例
Order | OrderDate | ClientName| ClientAddress | City | State| Zip |
-------|-----------|-----------|---------------|--------|------|-------|
CO101 | 1/5/2015 | Client ABC| 101 Park Drive| Boston | MA | 02134 |
C0102 | 2/6/2015 | Client ABC| 101 Park Drive| Boston | MA | 02134 |
C0103 | 1/7/2015 | Client ABC| 354 Foo Pkwy | Dallas | TX | 75001 |
C0104 | 3/7/2015 | Client ABC| 354 Foo Pkwy | Dallas | TX | 75001 |
C0105 | 5/7/2015 | Client XYZ| 1 Binary Road | Austin | TX | 73301 |
C0106 | 1/8/2015 | Client XYZ| 1 Binary Road | Austin | TX | 73301 |
C0107 | 7/9/2015 | Client XYZ| 51 Testing Rd | Austin | TX | 73301 |
我在 MS-SQL 服务器中设置了一个数据库,其中包含过去两年的所有客户订单。有些客户只有一个地点,有些则有多个地点。我想编写一个脚本,显示客户在至少有一个订单的总周数内按地点下的订单数量。
根据此脚本的结果,我希望能够推断出每个客户位置的独特订单(在不同时间下达)的摘要。例如:
- 客户 ABC 在地点 A 总共 35 周内下了 45 个订单
- 客户 ABC 在地点 B 总共 15 周内下了 35 个订单
- 客户 ABC 在地点 C 总共 15 周内下了 15 个订单
我想为每个客户的每个唯一位置查看此信息。我不确定如何以这种方式聚合数据。这是我的脚本所在的位置:
SELECT t1.ClientName, (SELECT DISTINCT t2.ClientAddress), COUNT(DISTINCT t2.Orders) AS TotalOrders,
DATEPART(week, t1.OrderDate) AS Week
FROM database t1
INNER JOIN database t2 on t1.Orders = t2.Orders
GROUP BY DATEPART(week, t1.OrderDate), t1.ClientAddress, t2.ClientAddress
HAVING COUNT(DISTINCT t2.SalesOrder) > 1
ORDER BY TotalOrders DESC
我得到的结果按周向我展示了按位置分类的唯一订单,但我不确定如何以我需要的方式计算周数;我曾尝试编写子查询,但我将 运行 放入问题中。我意识到在这个脚本中,我显示了每个星期按位置显示的订单数量,我想计算至少有一个订单的时间范围内的总周数。
结果结构如下:
| ClientName| ClientAddress | TotalOrders | Week |
|-----------|---------------|--------------|------|
|Client ABC |101 Park Drive | 30 | 21 |
|Client ABC |101 Park Drive | 29 | 13 |
|Client ABC |101 Park Drive | 28 | 10 |
|Client XYZ |1 Binary Road | 27 | 19 |
|Client XYZ |1 Binary Road | 25 | 7 |
|Client XYZ |51 Testing Rd | 22 | 9 |
任何帮助将不胜感激;提前谢谢你。
这不就是你想要的吗?
SELECT t1.ClientName, ClientAddress, COUNT(DISTINCT t1.Orders) AS TotalOrders,
COUNT(DISTINCT DATEPART(week, t1.OrderDate)) AS Weeks
FROM database t1
GROUP BY t1.ClientName, t1.ClientAddress
HAVING COUNT(DISTINCT t2.SalesOrder) > 1
ORDER BY TotalOrders DESC
我不太明白你为什么要进行自我加入。对我来说似乎没用,但我把它留在里面,以防万一,并且只关注我为获得您的结果所做的更改。