我在做什么错?我需要确保“ OrderCount”列中的值仅显示大于20的值。请注意:在这种情况下,不允许使用JOIN。
SELECT FirstName, LastName, (SELECT COUNT(SalesOrderID)
FROM SalesOrderHeader
WHERE SalesOrderHeader.ContactID = Contact.ContactID) AS OrderCount
FROM Contact
WHERE COUNT(SalesOrderID) = (SELECT COUNT(SalesOrderID)
FROM SalesOrderHeader
WHERE COUNT(SalesOrderID) > 20
答案 0 :(得分:1)
基本上,您还需要在where
子句中关联子查询-您的订单计算所有订单,而不仅仅是相关客户的订单。
但是子查询似乎更简单:
SELECT *
FROM (
SELECT c.FirstName, c.LastName,
(
SELECT COUNT(s.SalesOrderID)
FROM SalesOrderHeader s
WHERE s.ContactID = c.ContactID
) AS OrderCount
FROM Contact c
) t
where OrderCount > 20
请注意:在这种情况下,我不允许使用JOIN。
这确实是一个人为的例子。在现实生活中,使用外部聚合和having
子句的连接或横向连接会更合适:
SELECT c.FirstName, c.LastName, o.OrderCount
FROM Contact c
CROSS APPLY (
SELECT COUNT(s.SalesOrderID) as OrderCount
FROM SalesOrderHeader s
WHERE s.ContactID = c.ContactID
) AS o
where o.OrderCount > 20
答案 1 :(得分:1)
SELECT FirstName, LastName, (SELECT COUNT(SalesOrderID)
FROM SalesOrderHeader
WHERE SalesOrderHeader.ContactID = Contact.ContactID) AS OrderCount
FROM Contact
WHERE Contact.ContactID in (SELECT
SalesOrderHeader.ContactID
FROM SalesOrderHeader
Group by
SalesOrderHeader.ContactID
Having COUNT(*) > 20
答案 2 :(得分:0)
这里的问题不是子查询,而是引起问题的聚合函数(在这种情况下为COUNT
)。您不能在FROM
的{{1}}中放置引用表的聚合函数,而在WHERE
中引用它。
我认为您也可以将其压缩为不需要子查询:
HAVING