Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 вопрос  [new]
AlinaMalina
Member

Откуда:
Сообщений: 29
Подскажите, как посчитать кол-во совпадений в столбце?
26 ноя 11, 22:01    [11664930]     Ответить | Цитировать Сообщить модератору
 Re: вопрос  [new]
londinium
Member

Откуда: Киев
Сообщений: 1199
USE tempdb
GO
IF OBJECT_ID(N'TTT',N'U') IS NOT NULL
  DROP TABLE TTT;
CREATE TABLE TTT
(
  ID TINYINT NOT NULL,
  SURNAME VARCHAR(50)NOT NULL
)  
INSERT TTT(ID,SURNAME)
VALUES(1,'IVANOFF'),(2,'PETROFF'),(3,'SIDOROFF'),
(4,'IVANOFF');

SELECT COUNT(*),SURNAME FROM TTT
GROUP BY SURNAME;

DROP TABLE TTT;
оно?
26 ноя 11, 22:08    [11664944]     Ответить | Цитировать Сообщить модератору
 Re: вопрос  [new]
AlinaMalina
Member

Откуда:
Сообщений: 29
спасибо,все работает)
26 ноя 11, 22:12    [11664960]     Ответить | Цитировать Сообщить модератору
 Re: вопрос  [new]
AlinaMalina
Member

Откуда:
Сообщений: 29
SELECT CLIENT.surname
FROM CLIENT
INNER JOIN Orders
ON CLIENT.id=Orders.id
WHERE Orders.status_O='realized'
GROUP BY CLIENT.surname
HAVING COUNT(Orders.status_O)>=2


Не выводит ничего,хотя запрос выполняется. Как сделать условия,что заказ выполнен и это кол-во больше 2 у одного клиента в одном запросе?
26 ноя 11, 23:18    [11665109]     Ответить | Цитировать Сообщить модератору
 Re: вопрос  [new]
fabulaspb
Member

Откуда: Санкт-Петербург
Сообщений: 34
AlinaMalina,

Скорее всего Вы неверно соединяете таблицы client и orders.
26 ноя 11, 23:40    [11665177]     Ответить | Цитировать Сообщить модератору
 Re: вопрос  [new]
AlinaMalina
Member

Откуда:
Сообщений: 29
просто если убрать WHERE Orders.status_O='realized' или HAVING COUNT(Orders.status_O)>=2 ,то он выводит все,но вместе эти два условия не выполняются.
27 ноя 11, 00:01    [11665249]     Ответить | Цитировать Сообщить модератору
 Re: вопрос  [new]
fabulaspb
Member

Откуда: Санкт-Петербург
Сообщений: 34
AlinaMalina,

Дело в том, что Вы соединяете таблицы, используя следующий предикат: ON client.id = orders.id. Т.е. в результирующую таблицу попадают те строки, у которых значения столбцов идентификатор клиента и идентификатор заказа совпадают.
27 ноя 11, 00:07    [11665263]     Ответить | Цитировать Сообщить модератору
 Re: вопрос  [new]
fabulaspb
Member

Откуда: Санкт-Петербург
Сообщений: 34
fabulaspb,

Правильный запрос, скорее всего будет выглядеть так:

SELECT CLIENT.surname 
FROM CLIENT
INNER JOIN Orders ON CLIENT.id=Orders.customer_id
WHERE Orders.status_O='realized'
GROUP BY CLIENT.surname
HAVING COUNT(*)>=2
27 ноя 11, 00:10    [11665275]     Ответить | Цитировать Сообщить модератору
 Re: вопрос  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
fabulaspb
Правильный запрос
В правильном запросе всегда должна быть указана схема и алиас (не обязательно короткий).
SELECT	C.SurName
FROM	     dbo.Orders	O
	JOIN dbo.Client	C ON C.ID = O.Customer_ID
WHERE	O.Status_O = 'realized'
GROUP BY C.SurName
HAVING	Count(*) > 1
Но и сам запрос не имеет смысла.

Или искать одинаковых клиентов и с тем же именем.
SELECT	C.SurName
FROM	dbo.Client C
GROUP BY C.SurName
HAVING	Count(*) > 1
Или искать клиентов заказавших более одного товара.
SELECT	O.Customer_ID
FROM	dbo.Orders O
WHERE	O.Status_O = 'realized'
GROUP BY O.Customer_ID
HAVING	Count(*) > 1
Или искать одинаковых клиентов с тем же именем и заказавших хотя бы один товар (с состоянием realized).
SELECT	C.SurName
FROM	dbo.Client C
WHERE	Exists(	SELECT	*
		FROM	dbo.Orders O
		WHERE	    O.Customer_ID = C.ID
			AND O.Status_O    = 'realized'
	)
GROUP BY C.SurName
HAVING	Count(*) > 1

Более одного товара на клиента, с выводом его имени:
SELECT	C.SurName
FROM  (	SELECT	O.Customer_ID
	FROM	dbo.Orders O
	WHERE	O.Status_O = 'realized'
	GROUP BY O.Customer_ID
	HAVING	Count(*) > 1)	G
	JOIN dbo.Client		C ON C.ID = G.Customer_ID
Или:
;WITH ManyOrders AS (
	SELECT	O.Customer_ID
	FROM	dbo.Orders O
	WHERE	O.Status_O = 'realized'
	GROUP BY O.Customer_ID
	HAVING	Count(*) > 1
)
	SELECT	C.SurName
	FROM	     ManyOrders	M
		JOIN dbo.Client	C ON C.ID = G.Customer_ID
27 ноя 11, 03:33    [11665859]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить