SQL查询以统计分组不同列的总行数
我有一个包含RMA返回数据的数据库。我想写一个查询来返回一个单元被返回的总次数(每个返回都有一个唯一的RMA编号)。我还需要返回一个单元多次返回的次数,以及它针对相同症状返回的次数。每次装置到达一个站点时都会创建一个记录(为每个站点记录传播RMA、症状和返回的日期) 数据如下所示:SQL查询以统计分组不同列的总行数,sql,sql-server,Sql,Sql Server,我有一个包含RMA返回数据的数据库。我想写一个查询来返回一个单元被返回的总次数(每个返回都有一个唯一的RMA编号)。我还需要返回一个单元多次返回的次数,以及它针对相同症状返回的次数。每次装置到达一个站点时都会创建一个记录(为每个站点记录传播RMA、症状和返回的日期) 数据如下所示: ID SN RMA SYMPTOM Station Date_Returned 21567 A001 84704 POWER FAULT
ID SN RMA SYMPTOM Station Date_Returned
21567 A001 84704 POWER FAULT DockRecv 01/01/2015
21568 A001 84704 POWER FAULT Repair 01/01/2015
21569 A001 84704 POWER FAULT Ship 01/01/2015
10235 A002 83494 NO DISPLAY DockRecv 02/20/2015
10236 A002 83494 NO DISPLAY Repair 02/20/2015
10237 A002 83494 NO DISPLAY Ship 02/20/2015
36548 A002 84283 ABNORMAL NOISE DockRecv 10/05/2015
36549 A002 84283 ABNORMAL NOISE Repair 10/05/2015
36550 A002 84283 ABNORMAL NOISE Ship 10/05/2015
38790 A003 83432 HDD FAULT DockRecv 09/15/2015
38791 A003 83432 HDD FAULT Repair 09/15/2015
38792 A003 83432 HDD FAULT Ship 09/15/2015
69613 A003 84276 HDD FAULT DockRecv 01/30/2016
69614 A003 84276 HDD FAULT Repair 01/30/2016
69615 A003 84276 HDD FAULT Ship 01/30/2016
56732 A004 82011 NFF DockRecv 12/01/2015
56733 A004 82011 NFF Repair 12/01/2015
56734 A004 82011 NFF Ship 12/01/2015
Total_Returns Repeat_Return Same_Symptom_Return
6 2 1
我的输出需要如下所示:
ID SN RMA SYMPTOM Station Date_Returned
21567 A001 84704 POWER FAULT DockRecv 01/01/2015
21568 A001 84704 POWER FAULT Repair 01/01/2015
21569 A001 84704 POWER FAULT Ship 01/01/2015
10235 A002 83494 NO DISPLAY DockRecv 02/20/2015
10236 A002 83494 NO DISPLAY Repair 02/20/2015
10237 A002 83494 NO DISPLAY Ship 02/20/2015
36548 A002 84283 ABNORMAL NOISE DockRecv 10/05/2015
36549 A002 84283 ABNORMAL NOISE Repair 10/05/2015
36550 A002 84283 ABNORMAL NOISE Ship 10/05/2015
38790 A003 83432 HDD FAULT DockRecv 09/15/2015
38791 A003 83432 HDD FAULT Repair 09/15/2015
38792 A003 83432 HDD FAULT Ship 09/15/2015
69613 A003 84276 HDD FAULT DockRecv 01/30/2016
69614 A003 84276 HDD FAULT Repair 01/30/2016
69615 A003 84276 HDD FAULT Ship 01/30/2016
56732 A004 82011 NFF DockRecv 12/01/2015
56733 A004 82011 NFF Repair 12/01/2015
56734 A004 82011 NFF Ship 12/01/2015
Total_Returns Repeat_Return Same_Symptom_Return
6 2 1
A001(RMA 84704)是一个单一的返回
A002是多次退货-(RMA 83494)是第一次退货(维修后,机组发货),在现场一段时间后,机组再次退货A002(RMA 84283)。。。。当一个单元返回时,它经过3个站点(我们为每个站点创建一个记录(传播每个站点记录返回的RMA、症状和日期)
我可以通过以下代码获得总回报:
Select count(*) as totalcount
From
(
SELECT
[SN]
,[RMA]
FROM [dbo].[test]
Group by [SN],[RMA]
)as a
计算计数需要3种完全不同的方法,因此我使用了3个单独的子查询。请参见以下在sqlfiddle(但不在MS SQL Server上)上使用的方法: 结果:
| Total_Count | Repeat_Return | Same_Symptom_Return |
|-------------|---------------|---------------------|
| 6 | 2 | 1 |
|Total_Returned | Repeat_Return | Same_Symptom_Return |
|---------------|---------------|---------------------|
| 6 | 2 | 1 |
查询:
select
(select count(distinct SN + RMA + SYMPTOM) from table1) as Total_Count
, (select count(*) from(
SELECT SN
FROM table1
Group by SN
having count(distinct Date_Returned) > 1)
) as Repeat_Return
, (select count(*) from(
SELECT SYMPTOM
FROM table1
Group by SYMPTOM
having count(*)/3 > 1)
) as Same_Symptom_Return
注意:您应该在问题中添加“sql server”作为标记(我想这是因为[dbo].[test]我让它工作了……我确信有一种更精简的方式来编写它
SELECT
-- Get Total_Returned Count
(Select distinct
count(*) as 'Total_Returned'
From
( SELECT
[SN]
,[RMA]
FROM [dbo].[test]
Group by [SN],[RMA]
)a) AS 'Total_Returned'
-- Get Repeat_Return Count
,(Select distinct
[Repeat_Return] - COUNT(*) OVER() AS [Repeat_Return]
From
( SELECT
COUNT(*) OVER() AS [Repeat_Return]
,[SN]
,[RMA]
FROM [dbo].[test]
Group by [SN],[RMA]
)a Group by [SN],[Repeat_Return]) AS 'Repeat_Return'
-- Get Same_Symptom_Return Count
,(Select distinct
[Same_Symptom_Return] - COUNT(*) OVER() AS [Same_Symptom_Return]
From
( SELECT
COUNT(*) OVER() AS [Same_Symptom_Return]
,[SN]
,[RMA]
,SYMPTOM
FROM [dbo].[test]
Group by SN, SYMPTOM, RMA
)a Group by [SN], SYMPTOM, [Same_Symptom_Return]) AS 'Same_Symptom_Return'
结果:
| Total_Count | Repeat_Return | Same_Symptom_Return |
|-------------|---------------|---------------------|
| 6 | 2 | 1 |
|Total_Returned | Repeat_Return | Same_Symptom_Return |
|---------------|---------------|---------------------|
| 6 | 2 | 1 |
你的rdbms和版本是什么?在你的样本中有4个不同的RMA,那么为什么总回报是6?是的,总回报是6…运行sql server 6.1.7601为什么是6?总回报是多少?你的样本数据和预期结果没有意义。你的
不同的RMA
计数是5,那么重复计数应该是1两者都有。如果您将83494
替换为84704
,那么您可以得到您的示例预期结果,但是…您的重复返回和相同的症状
与您的预期结果不匹配。请阅读,这里是学习如何提高问题质量和获得更好答案的好地方。