我在我们的票务系统中设置了“前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
任何建议表示赞赏。
答案 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)