如何修改ROLLUP生成的汇总行指定列文本并避免重复行
如何修改ROLLUP生成的汇总行指定列文本并避免重复行
嘿,我来帮你搞定这个问题!你现在遇到的是ROLLUP汇总行的自定义显示和重复行问题,咱们直接调整你的SQL语句就能解决:
首先,核心思路是利用GROUPING()函数识别ROLLUP生成的汇总行,再用CASE语句把汇总行的「Nazwisko」列替换成你想要的「Sum:」;同时完善GROUP BY的列并加过滤条件,避免出现重复的汇总行。
修改后的完整SQL如下:
SELECT orders.order_id AS "Nr. zamówienia", orders.order_date AS "Data zamówienia", products.name AS "Nazwa produtku", products.price AS "Cena produtku", orders.count AS "Ilość", clients.client_id AS "Numer klienta", clients.first_name AS "Imię", -- 用CASE判断是否为汇总行,替换Nazwisko内容 CASE WHEN GROUPING(orders.order_id) = 1 THEN 'Sum:' ELSE clients.last_name END AS "Nazwisko", SUM(orders.count * products.price) AS "Cena Łączna" FROM orders INNER JOIN clients ON orders.client_id = clients.client_id INNER JOIN products ON orders.product_id = products.product_id WHERE orders.client_id = 215234 -- 把所有非聚合的列都加入GROUP BY,避免生成多余的中间汇总行 GROUP BY orders.order_id, orders.order_date, products.name, products.price, orders.count, clients.client_id, clients.first_name, clients.last_name WITH ROLLUP -- 过滤掉不需要的中间行,只保留订单明细和最终汇总行 HAVING GROUPING(orders.order_id) = 0 OR GROUPING(clients.last_name) = 1;
我给你拆解下关键修改点:
- 自定义汇总行文本:
GROUPING(orders.order_id) = 1会识别出ROLLUP生成的总汇总行(这一行的order_id会被置为NULL,GROUPING函数返回1),此时用CASE把「Nazwisko」列改成「Sum:」,其他行正常显示客户姓氏。 - 避免重复行:你之前只按
orders.order_id分组加ROLLUP,会生成很多中间汇总行;现在把所有非聚合的列都加入GROUP BY,再用HAVING过滤,只保留每个订单的明细行和最后的总汇总行,就不会有重复的行出现了。
如果你的数据库(比如MySQL、PostgreSQL)对GROUP BY的语法细节有不同要求,稍微调整下GROUP BY的列顺序或者HAVING条件就行,核心逻辑是通用的~
备注:内容来源于stack exchange,提问作者kompus
相关产品推荐
相关产品推荐

