Во-первых, я предполагаю, что в таблице «Заказ» может и, скорее всего, будет несколько записей на одного клиента.Так как вам нужно знать, нет ли каких-либо заказов, но, по-видимому, нужен набор результатов, вы не можете отфильтровать на основе желаемого описания ... Но вы можете, если вы группируете по клиенту (и описанию) и используете счетфункция, и это также позволяет вам возвращать одну запись, когда их может быть много в таблице Order.
Также, поскольку вы в конечном итоге пытаетесь ответить на два вопроса на основе двух наборов результатов (телевизионных заказов и любых заказов), товам понадобится какая-то версия двух запросов.Несколько вариантов, но подзапрос - самый простой.
Вот SQL (я сделал временную таблицу постоянной для этого, а также добавил больше записей):
CREATE TABLE [dbo].[Customer](
[CustId] [int] NOT NULL,
[CustomerName] [varchar](50) NOT NULL
)
CREATE TABLE [dbo].[Order](
[OrderId] [int] NOT NULL,
[CustId] [int] NOT NULL,
[Description] [varchar](50) NOT NULL
)
CREATE TABLE [dbo].[FakeTemp](
[Description] [varchar](50) NOT NULL
)
INSERT INTO FakeTemp (Description) VALUES
('TV')
GO
INSERT INTO customer (CustId, CustomerName) VALUES
(1, 'John'),
(2, 'Tom'),
(3, 'Steve')
GO
INSERT INTO [order] (OrderId, CustId, Description) VALUES
(1, 1, 'TV')
go
INSERT INTO [order] (OrderId, CustId, Description) VALUES
(2, 2, 'VCR')
go
INSERT INTO [order] (OrderId, CustId, Description) VALUES
(3, 1, 'VCR')
go
select c.CustomerName, count(OrderId) as TV_Orders
, (select count(OrderID) from [order] where CustId = 1) as All_Orders
from customer c
left outer join [order] o on c.CustId = o.CustId
inner join FakeTemp t on o.Description = t.Description
where c.CustID = 1
group by c.CustomerName, t.Description
А вот ссылкана скрипку (спасибо Роману Пекару за то, что он меня запустил): http://sqlfiddle.com/#!18/eadc3/16/0
Я не сделал оператор case, так как думаю, что вы легко можете превратить его в оператор case, необходимый для вывода текста, иэто показывает результаты немного лучше.
Для тех, кто не смог завершить описание дела, вот домашняя задача, выполненная полностью:
select
CASE
WHEN (select count(OrderID) from orders where CustId = 1) = 0 THEN 'Did not find any orders'
WHEN count(OrderID) = 0 THEN 'Found order but not TV order'
ELSE 'Found TV Order'
End as Status
from customer c
left outer join [orders] o on c.CustId = o.CustId
inner join FakeTemp t on o.Description = t.Description
where c.CustID = 1
group by c.CustomerName, t.Description