如何在SQL中的更大结果集中组合特定结果

时间:2016-01-11 14:38:44

标签: sql tsql

我在我们的票务系统中设置了“前20名”报告,以显示记录最多票据的客户。 大多数客户在系统中包含一个“帐户”,但新客户包含一个实际客户的17个单独“帐户”。

在运行前20名报告时,我现在需要将17个结果合并为此客户在其余结果中的1'主要'帐户总数。 17个单独的“帐户”从未进入前20名,而合并金额却不确定如何修改我的查询以仅为一个特定客户端执行此操作。

原文:

SELECT TOP 20    
    wh_account.account_name AS 'Client',    
    COUNT(wh_task.task_number) AS 'Total'    
FROM wh_account    
LEFT JOIN wh_task 
  ON wh_task.account_id = wh_account.account_id    
WHERE wh_task.create_time BETWEEN @StartofLastMonth AND @EndofLastMonth
GROUP BY wh_account.account_name
ORDER BY COUNT(wh_task.task_number) DESC

任何建议表示赞赏。

1 个答案:

答案 0 :(得分:0)

您需要将这17个帐户中的值相加1.方法是使用窗口函数。如果您愿意,您甚至可以在ORDER BY子句中执行此操作:

SELECT TOP 20 a.account_name AS Client,    
       COUNT(t.task_number) AS Total   
FROM wh_account a LEFT JOIN
     wh_task t
     ON t.account_id = a.account_id    
WHERE t.create_time BETWEEN @StartofLastMonth AND @EndofLastMonth
GROUP BY a.account_name
ORDER BY SUM(COUNT(t.task_number)) OVER
             (PARTITION BY (CASE WHEN a.account_name NOT IN (<list of 17 goes here>)
                                 THEN a.account_name
                            END)
             );

这个版本在他们自己的行上留下17,但如果合适的话,将它们包含在前20行中。

编辑:

我觉得你可能希望在一行而不是17行上看到所有17个。如果是,请使用CASE进行聚合:

SELECT TOP 20
       (CASE WHEN a.account_name IN (<list of 17 here>)
               THEN 'Main' ELSE a.account_name
        END) AS Client,    
       COUNT(t.task_number) AS Total   
FROM wh_account a LEFT JOIN
     wh_task t
     ON t.account_id = a.account_id    
WHERE t.create_time BETWEEN @StartofLastMonth AND @EndofLastMonth
GROUP BY (CASE WHEN a.account_name IN (<list of 17 here>)
               THEN 'Main' ELSE a.account_name
          END)