Sql查询显示在表中出现多次的记录

时间:2016-10-16 20:25:41

标签: sql sql-server

我有两个表,CustomerCustomerID, FirstName, AddressPurchasesPurchaseID, Qty, CustomersID

我想创建一个查询,显示已购买两件以上产品的FirstName,产品数量由数量表示。

我似乎无法解决这个问题 - 我刚刚开始使用T-SQL

4 个答案:

答案 0 :(得分:0)

您可以对购买进行求和,并使用having子句过滤您感兴趣的内容。然后,您可以使用in运算符仅查询符合这些ID的客户名称:

SELECT FirstName
FROM   Customer
WHERE  CustomerID IN (SELECT   CustomerID
                      FROM     Purchases
                      GROUP BY CustomerID
                      HAVING   SUM(Qty) > 2)

答案 1 :(得分:0)

请试试这个:

select c.FirstName,p.Qty
from Customer as c
join Purchase as p
on c.CustomerID = p.CustomerID
where CustomerID in (select CustomerID from Purchases group by CustomerID having count(CustomerID)>2);

答案 2 :(得分:0)

  

请尝试这个,根据你的问题它应该适合你。

cascade = CascadeType.ALL

答案 3 :(得分:0)

SELECT
    c.FirstName
FROM
    Customer c
    INNER JOIN Purchases p
    ON c.CustomerId = p.CustomerId
GROUP BY
    c.FirstName
HAVING
    SUM(p.Qty) > 2

虽然IN建议可行,但它们有点矫枉过正,而且可能比使用聚合的直接连接更不具备性能。诀窍是HAVING Clause使用它你可以将结果限制在你想要的名字。这是一个链接,可以了解有关IN与Exists vs JOIN(NOT IN vs NOT EXISTS

的更多信息

有很多方法可以实现这一点,并向您介绍窗口函数和常用表格表达式,这些表达式在这个简化示例中非常有用,但在您的工具集中非常宝贵,因为您的查询会继续变得更加复杂:

;WITH cte AS (
    SELECT DISTINCT
       c.FirstName
       ,SUM(p.Qty) OVER (PARTITION BY c.CustomerId) as SumOfQty
    FROM
       Customer c
       INNER JOIN Purchases p
       ON c.CustomerId = p.CustomerId
)

SELECT *
FROM
    cte
WHERE
     SumOfQty > 2