首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Inner customers with orders

SQL Inner customers with orders
EN

Stack Overflow用户
提问于 2014-12-06 10:57:22
回答 2查看 1.5K关注 0票数 1

如果我有两个表(一个是customers,包含他们的信息,包括地址、姓名、电子邮件等),另一个是orders (包含订单号、发货日期、订购该商品的客户名称),我如何显示少于3个订单的客户的电子邮件?

我知道我必须使用内部连接和一些别名,但我不确定如何继续。

谢谢!

到目前为止,我所拥有的:

代码语言:javascript
复制
SELECT customer.email 
FROM customer as cust 
INNER JOIN (select customer_id, sum(line_qty) AS total 
            from orders as o ON cust.customer_id = o.customer_id 
            where total = (SELECT total < 3 
                           FROM (select customer_id, sum(line_qty) AS total 
                                 from orders as o ON cust.customer_id = o.customer_id
                                ) as sub);
EN

回答 2

Stack Overflow用户

发布于 2014-12-06 11:38:22

我已经用SQL创建了完整的示例。只需运行该查询即可创建数据库、表和存储过程"Get Customer Orders“。

在两个"Customers“表和" Orders”表中有示例数据,关系是"1个客户对多个订单“,因此表Orders中的Customer有一个外键,用于识别哪个客户完成了订单。所以。

首先创建数据库,运行以下查询。

代码语言:javascript
复制
Create DataBase [Customer_OrdersDB]

刷新服务器资源管理器,您会发现已经创建了一个同名的数据库。然后运行查询以创建存储过程和表。

代码语言:javascript
复制
    USE [Customer_OrdersDB]
GO
CREATE PROCEDURE [dbo].[GetCustomer_Mail] 
AS
BEGIN
select Email as Customer_Mail 
from Customers as cust inner join Orders as ord
on cust.CustomerId = ord.OrderCustomerId
group by(Email)
having COUNT(ord.OrderCustomerId) < 3
END

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Customers](
    [CustomerId] [int] IDENTITY(1,1) NOT NULL,
    [CustomerName] [nvarchar](50) NULL,
    [Address] [nvarchar](50) NULL,
    [Email] [nvarchar](50) NULL,
 CONSTRAINT [PK_Customers] PRIMARY KEY CLUSTERED 
(
    [CustomerId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
/****** Object:  Table [dbo].[Orders]    Script Date: 12/6/2014 5:19:11 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Orders](
    [OrderId] [int] IDENTITY(1,1) NOT NULL,
    [OrderDate] [datetime] NULL,
    [OrderNumber] [nvarchar](50) NULL,
    [OrderCustomerId] [int] NULL,
 CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED 
(
    [OrderId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET IDENTITY_INSERT [dbo].[Customers] ON 

INSERT [dbo].[Customers] ([CustomerId], [CustomerName], [Address], [Email]) VALUES (1, N'Ahmed', N'Cairo', N'Ahmed@Yahoo.Com')
INSERT [dbo].[Customers] ([CustomerId], [CustomerName], [Address], [Email]) VALUES (2, N'Ali', N'Paris', N'Ali@yahoo.com')
INSERT [dbo].[Customers] ([CustomerId], [CustomerName], [Address], [Email]) VALUES (3, N'Samir', N'UK', N'Samir@msn.com')
SET IDENTITY_INSERT [dbo].[Customers] OFF
SET IDENTITY_INSERT [dbo].[Orders] ON 

INSERT [dbo].[Orders] ([OrderId], [OrderDate], [OrderNumber], [OrderCustomerId]) VALUES (1, CAST(0x0000A2A600000000 AS DateTime), N'1234', 1)
INSERT [dbo].[Orders] ([OrderId], [OrderDate], [OrderNumber], [OrderCustomerId]) VALUES (2, CAST(0x0000A2C700000000 AS DateTime), N'555', 1)
INSERT [dbo].[Orders] ([OrderId], [OrderDate], [OrderNumber], [OrderCustomerId]) VALUES (3, CAST(0x00009CF100000000 AS DateTime), N'56d66', 1)
INSERT [dbo].[Orders] ([OrderId], [OrderDate], [OrderNumber], [OrderCustomerId]) VALUES (4, CAST(0x00009E9B00000000 AS DateTime), N'555we', 2)
INSERT [dbo].[Orders] ([OrderId], [OrderDate], [OrderNumber], [OrderCustomerId]) VALUES (5, CAST(0x0000A2A600000000 AS DateTime), N'1234', 1)
INSERT [dbo].[Orders] ([OrderId], [OrderDate], [OrderNumber], [OrderCustomerId]) VALUES (6, CAST(0x0000A2C700000000 AS DateTime), N'555', 1)
SET IDENTITY_INSERT [dbo].[Orders] OFF
ALTER TABLE [dbo].[Orders]  WITH CHECK ADD  CONSTRAINT [FK_Orders_Customers] FOREIGN KEY([OrderCustomerId])
REFERENCES [dbo].[Customers] ([CustomerId])
GO
ALTER TABLE [dbo].[Orders] CHECK CONSTRAINT [FK_Orders_Customers]
GO

然后,为了访问您的存储过程,如果他/她的订单少于3个,您希望获得客户的电子邮件。

  1. 中,转到服务器/对象资源管理器。
  2. 选择名为

的数据库单击您的存储过程"GetCustomer_Mail“,然后选择Execute。

票数 1
EN

Stack Overflow用户

发布于 2014-12-06 14:14:41

试试这个:

代码语言:javascript
复制
SELECT c.email 
FROM customer AS c 
LEFT OUTER JOIN orders AS o ON c.customer_id = o.customer_id 
GROUP BY c.email 
HAVING SUM(o.line_qty) < 3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27327810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档