用户定义的功能以及子查询

时间:2019-06-21 14:35:30

标签: sql-server

创建一个名为XXRepeatCustomer的用户定义函数(其中XX是您的姓名首字母)。该功能是具有一个输入参数。将INT数据类型用作输入参数。执行该函数时,将为下订单数量大于或等于通过输入参数传递的订单数量的客户返回三列表(CustFirstName,CustLastName和Phone)。

为了接收所下的订单总数,我将Customer表和CustOrder表连接在一起。问题只希望我显示每个客户的第一个,最后一个和电话,但不显示订单总数。我正在努力分配@orders参数,并计算子查询中的订单总数。

CREATE FUNCTION dbo.JERepeatCustomer
(@orders INT)
RETURNS TABLE AS
RETURN (SELECT CustFirstName, CustLastName, Phone 
FROM Customer C JOIN CustOrder CO
ON C.CustomerID = CO.CustomerID
WHERE @orders <= OrderID AND OrderID = (SELECT COUNT (DISTINCT OrderID) FROM CustOrder)
GROUP BY CustFirstName, CustLastName, Phone)

我希望用户输入7,或任何数字,结果仅显示订购7以上的客户。

2 个答案:

答案 0 :(得分:1)

您需要的关键字是HAVING。 HAVING与WHERE相似。 WHERE将基于该列中的特定值过滤返回的行,而HAVING将基于该列中的聚合值过滤行。

例如,您有一个客户表,在订单表中,您拥有每个客户的所有订单。

DECLARE @input INT = 7
SELECT ct.customer, ct.phone, COUNT(ot.orderID)
FROM customertable ct
INNER JOIN ordertable ot
ON ct.customerID = ot.customerID 

GROUP BY ct.customer, ct.phone
HAVING COUNT(ot.OrderID) >= @input  

答案 1 :(得分:0)

SELECT CustFirstName, CustLastName, Phone 
FROM Customer C 
     CORSS APPLY (
             SELECT COUNT(*) AS Orders
             FROM CustOrder CO
             WHERE  C.CustomerID = CO.CustomerID) CustomerOrders
Where CustomerOrders.Orders >= @orders