我有一个 SQL 查询(MSSQLSERVER),我在其中使用子选择将列添加到结果集中:
SELECT P.name,
(select count(*) from cars C where C.type = 'sports') AS sportscars,
(select count(*) from cars C where C.type = 'family') AS familycars,
(select count(*) from cars C where C.type = 'business') AS businesscars
FROM people P
WHERE P.id = 1;
上面的查询只是来自一个有点废话的测试设置,但它作为我认为的示例已经足够好了。我实际上正在处理的查询跨越了许多复杂的表,这些表只会分散手头的问题。
在上面的示例中,“people”表中的每条记录还具有三个附加列:“wantsSportscar”、“wantsFamilycar”和“wantsBusinesscar”。现在我想做的只是如果人员表中的相应“想要.....”字段设置为“真”,则只对每个附加列进行子选择。换句话说,如果 P.wantsSportscar 为那个特定的人设置为 true,我只想做第一个子选择。第二个和第三个子选择应该以类似的方式工作。
因此,此查询的工作方式应该是显示特定人员的姓名以及他想要拥有的汽车类型的可用车型数量。可能值得注意的是,我的最终结果集将始终只包含一条记录,即一个特定用户的记录。
重要的是,如果一个人对某种类型的汽车不感兴趣,那么该类型的列将不会包含在最终结果集中。一个确保这一点很清楚的例子:
如果 A 想要一辆跑车和一辆家庭车,则结果将包括“名称”、“跑车”和“家庭车”列。
如果 B 想要商务车,则结果将包括“名称”和“商务车”列。
我一直在尝试将各种组合与 IF、CASE 和 EXISTS 语句结合使用,但到目前为止,我还无法获得语法正确的解决方案。有谁知道这是否可能?请注意,查询将存储在存储过程中。