A有一个包含行的表,其中包含发票数据和这些行所属的人员数据。
像
这样的东西name, birthday, sex, invoice_date, invoice_amount
首先,我想获得每个独特人物的所有数据集。所以我做了像这样的选择
SELECT * FROM data WHERE invoice_amount < 10 GROUP BY name, birthday
通过这个我过滤所有相同人的重复条目。
现在我想知道这些人中有多少是女性 - 不是所有行,而是分组结果。我的意思是我想从结果中做出选择(我不认为WHERE invoice_amount <10 AND sex = 1
)。我该怎么做?
那么如何为该示例案例进行嵌套选择?
答案 0 :(得分:1)
您始终可以使用子查询:
SELECT sex, count(*)
FROM (
SELECT * FROM data WHERE invoice_amount < 10 GROUP BY name, birthday
) s
GROUP BY sex
但请注意,选择所有字段并不被视为良好做法,并且在不使用聚合函数的情况下按较少字段分组。我最好这样写你的查询:
SELECT sex, COUNT(DISTINCT name, birthday)
FROM data
WHERE invoice_amount < 10
GROUP BY sex
<强>更新强>
该表未规范化,因此可能会发生同一个人(同一个名字和同一个生日)在不同行上有不同的性别信息。
这里有两种选择。你可以忽略这个问题,大数据集中的一些错误不会(可能)产生很大的不同,所以你可以使用带有子查询的查询。
如果你SELECT *
但只使用GROUP BY name, birthday
,那么每个人只有一行,只有一个性别值(如果有多个值,那么你将得到的是不可预测的,但它在巨大的数据集上可以很好。)
但是如果你想确定哪些记录是错误的,你可以使用它:
SELECT name, birthday
FROM data
GROUP BY name, birthday
HAVING COUNT(DISTINCT sex)>1