面试题:编写T-SQL查询获取指定结果集
T-SQL 查询实现目标结果集方案
嘿,我来帮你搞定这个T-SQL查询问题!根据你给出的目标结果集样式,我先假设你的原始数据表(比如命名为FruitSales)包含以下字段:
SaleDateDATE:销售日期FruitNameVARCHAR(50):水果名称(对应目标里的Apple、Banana、Cherry)SalesAmountINT:销售数量
如果你的实际表结构或字段名不同,只需要对应替换即可。下面提供两种常用的实现方式:
方法1:使用PIVOT函数(适合固定列的场景)
PIVOT是SQL Server专门用于行转列的函数,代码简洁直观:
SELECT SaleDate AS [Date], Apple, Banana, Cherry FROM FruitSales PIVOT ( SUM(SalesAmount) -- 如果是求数量用SUM,求平均值用AVG,根据需求调整 FOR FruitName IN (Apple, Banana, Cherry) -- 指定要转成列的类别值 ) AS PivotedSales ORDER BY SaleDate;
说明:
- 如果你的数据中同一日期+水果有重复记录,
SUM会自动汇总,要是确保唯一可以用MAX或者MIN ORDER BY SaleDate是为了让结果按日期排序,和目标集的顺序一致
方法2:使用CASE WHEN(灵活适配动态列或复杂场景)
如果后续可能新增水果类别,或者需要更灵活的逻辑,用CASE WHEN的方式更可控:
SELECT SaleDate AS [Date], SUM(CASE WHEN FruitName = 'Apple' THEN SalesAmount ELSE 0 END) AS Apple, SUM(CASE WHEN FruitName = 'Banana' THEN SalesAmount ELSE 0 END) AS Banana, SUM(CASE WHEN FruitName = 'Cherry' THEN SalesAmount ELSE 0 END) AS Cherry FROM FruitSales GROUP BY SaleDate ORDER BY SaleDate;
说明:
- 这里用
SUM配合CASE WHEN,把符合条件的数值累加,不符合的记为0 - 要是不需要汇总,比如每行都是唯一的日期+水果,也可以用
MAX代替SUM
如果你的原始数据结构和我假设的不一样,比如字段名、类别名称不同,只需要替换对应的部分就行。比如如果类别是A/B/C,就把Apple这些换成A/B/C即可。
内容的提问来源于stack exchange,提问作者user1469712
相关产品推荐
相关产品推荐

