我有一张桌子,上面有来自不同用户的订单。每个用户(由电子邮件地址标识)可以有任意数量的订单。我没有额外的用户表,只有一个普通的 OrderData 表。我想要的听起来很简单:
- 用户总数
- XYZ 用户数
- 非 XYZ 用户数
其中 1. 是 2. 和 3. 的总和。“XYZ”用户由以“@xyz.com”结尾的电子邮件地址定义。
我想要一个查询,在三列中返回三个值。我目前拥有的是:
SELECT
(
SELECT COUNT(DISTINCT User_EmailAddress)
FROM OrderData
WHERE User_EmailAddress IS NOT NULL
AND RequestTime >= @RequestTimeFrom
AND RequestTime < @RequestTimeTo
) AS [Total Users],
(
SELECT COUNT(DISTINCT User_EmailAddress)
FROM OrderData
WHERE User_EmailAddress IS NOT NULL
AND User_EmailAddress LIKE '%@xyz.com'
AND RequestTime >= @RequestTimeFrom
AND RequestTime < @RequestTimeTo
) AS [XYZUsers],
(
SELECT COUNT(DISTINCT User_EmailAddress)
FROM OrderData
WHERE User_EmailAddress IS NOT NULL
AND User_EmailAddress NOT LIKE '%@xyz.com'
AND RequestTime >= @RequestTimeFrom
AND RequestTime < @RequestTimeTo
) AS [Non-XYZ Users]
它返回正确的结果集:
Total Users | XYZ Users | Non-XYZ Users
------------+-----------+--------------
123 | 23 | 100
有没有更好的方法来编写这个查询,而不是基本上使用相同的代码进行三个类似的查询?