SQL查询以统计分组不同列的总行数

SQL查询以统计分组不同列的总行数,sql,sql-server,Sql,Sql Server,我有一个包含RMA返回数据的数据库。我想写一个查询来返回一个单元被返回的总次数(每个返回都有一个唯一的RMA编号)。我还需要返回一个单元多次返回的次数,以及它针对相同症状返回的次数。每次装置到达一个站点时都会创建一个记录(为每个站点记录传播RMA、症状和返回的日期) 数据如下所示: ID SN RMA SYMPTOM Station Date_Returned 21567 A001 84704 POWER FAULT

我有一个包含RMA返回数据的数据库。我想写一个查询来返回一个单元被返回的总次数(每个返回都有一个唯一的RMA编号)。我还需要返回一个单元多次返回的次数,以及它针对相同症状返回的次数。每次装置到达一个站点时都会创建一个记录(为每个站点记录传播RMA、症状和返回的日期)

数据如下所示:

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
,那么您可以得到您的示例预期结果,但是…您的
重复返回
相同的症状
与您的预期结果不匹配。请阅读,这里是学习如何提高问题质量和获得更好答案的好地方。