SQL Inner Join клиентов с заказами

если у меня есть две таблицы (одна с клиентами с их информацией, включая адрес, имя, электронные письма и т. д.), а другая с заказами (с номером заказа, датой доставки, именем клиента, который заказал этот товар), как я могу показать электронную почту клиенты, у которых меньше 3 заказов?

Я знаю, что мне нужно использовать внутреннее соединение и некоторые псевдонимы, но я не уверен, что делать дальше.

Спасибо!

что у меня есть до сих пор:

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);

person Student3794    schedule 06.12.2014    source источник
comment
опубликуйте свою попытку. Фактически идите и создайте sqlfiddle со схемой и некоторыми примерами данных!   -  person Mitch Wheat    schedule 06.12.2014
comment
только что выложил @MitchWheat   -  person Student3794    schedule 06.12.2014
comment
Какую СУБД вы используете? Постгрес? Оракул?   -  person a_horse_with_no_name    schedule 06.12.2014


Ответы (2)


Я создал полный пример с SQL. Просто запустите запрос, чтобы создать базу данных, таблицы и хранимую процедуру «Получить заказы клиентов».

В двух таблицах «Клиенты» и в таблице «Заказы» есть образцы данных, отношение которых - «1 клиент к МНОГИМ заказам», поэтому внутри таблицы «Заказы» есть внешний ключ для клиента, чтобы определить, какой из клиентов выполнил заказ. Так.

Сначала создайте базу данных, запустите этот запрос.

Create DataBase [Customer_OrdersDB]

Обновите проводник сервера, вы обнаружите, что база данных с таким именем была создана. Затем запустите запрос, чтобы создать хранимую процедуру и таблицы.

    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'[email protected]')
INSERT [dbo].[Customers] ([CustomerId], [CustomerName], [Address], [Email]) VALUES (2, N'Ali', N'Paris', N'[email protected]')
INSERT [dbo].[Customers] ([CustomerId], [CustomerName], [Address], [Email]) VALUES (3, N'Samir', N'UK', N'[email protected]')
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. Перейдите в обозреватель серверов / объектов на SQL-сервере.
  2. Выберите свою базу данных с именем [Customer_OrdersDB].
  3. Выберите «Возможность программирования».
  4. Выберите «Сохраненные процедуры».
  5. Щелкните правой кнопкой мыши сохраненную процедуру «GetCustomer_Mail» и выберите «Выполнить».
person Mahmoud Mohamed    schedule 06.12.2014
comment
Как вы теперь пользуетесь SQL Server? - person a_horse_with_no_name; 06.12.2014

Попробуй это:

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
person Saharsh Shah    schedule 06.12.2014