如何避免SQL查询生成不必要的多余列?
解决方案
你当前的问题根源是按generation分组后,每行仅对应一个代际,其他代际的列自然无数据。以下两种方式可以解决多余列的问题:
方式1:生成单行汇总结果(所有代际总时间在同一行)
如果需要把所有代际的总出行时间放在一行展示,直接去掉GROUP BY generation即可,这样会对全表聚合,每个列对应对应代际的总时间,不会出现空值:
SELECT SUM(CASE WHEN generation = 'Millennials' THEN Rental_Duration_seconds ELSE 0 END) AS MillennialTT, SUM(CASE WHEN generation = 'Generation Z' THEN Rental_Duration_seconds ELSE 0 END) AS GenZTT, SUM(CASE WHEN generation = 'Generation X' THEN Rental_Duration_seconds ELSE 0 END) AS GenXTT, SUM(CASE WHEN generation = 'Baby Boomers' THEN Rental_Duration_seconds ELSE 0 END) AS BBYBoomerTT, SUM(CASE WHEN generation = 'Silent Generation' THEN Rental_Duration_seconds ELSE 0 END) AS SilentGenTT FROM dbo.2019_Q2_Trips;
方式2:行式展示(仅保留必要的两列)
如果不需要横向展开列,而是以行的形式展示每个代际的总时间,只需保留generation和对应总时间两列即可,完全避免多余列:
SELECT generation, SUM(Rental_Duration_seconds) AS TotalTripTime FROM dbo.2019_Q2_Trips GROUP BY generation;
说明
- 方式1适合需要横向对比所有代际数据的场景,结果是一行多列,无空值。
- 方式2是更简洁的聚合写法,结果是每行对应一个代际,仅包含代际名称和总时间,没有冗余列。
内容的提问来源于stack exchange,提问作者BigE
相关产品推荐
相关产品推荐

