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

+

DECLARE @Clients TABLE
(СlientId INT,
NAME NVARCHAR(50))

INSERT INTO @Clients 
SELECT '1', 'Test'

DECLARE @Contracts TABLE
(СlientId NVARCHAR(50),
ContractNum NVARCHAR(50))

INSERT INTO @Contracts 
SELECT '1', '26001'
UNION
SELECT '1', '26002'
UNION
SELECT '1', '26003'
UNION
SELECT '1', '26051'
UNION 
SELECT '1', NULL



есть простой запрос


SELECT DISTINCT 
		NAME,
		(SELECT COUNT (*) FROM @Contracts c2 WHERE LEFT (c2.contractnum,4)='2600'
		AND c2.СlientId=c.СlientId) AS '2600',
		(SELECT COUNT (*) FROM @Contracts c3 WHERE LEFT (c3.contractnum,4)='2605'
		AND c3.СlientId=c.СlientId) AS '2605'
FROM @Clients c


который выводит клиентов и количество счетов одного типа в строку

[NAME]	[2600]	[2605]
  Test	            3	           1


все проще простого.
Но когда данных много, связи не такие простые и к тому же увеличивается количество подзапросов, такая конструкция становится неудобной и тяжелой.

Думается мне, что можно переписать с помощью COUNT (ContractNum) + OVER (PARTITION BY) однако в точности такой же результат не получается пока.

Подскажите, как это можно сделать ?
11 май 12, 00:00    [12533414]     Ответить | Цитировать Сообщить модератору
 Re: простой запрос (подсчет значений)  [new]
Geep
Member

Откуда: Москва
Сообщений: 975
да это и конструкцией то назвать нельзя, недоразумение одно...
11 май 12, 00:21    [12533487]     Ответить | Цитировать Сообщить модератору
 Re: простой запрос (подсчет значений)  [new]
hallabud
Member

Откуда: Киев
Сообщений: 245
Gust12,

SELECT cname, [2600], [2605]
FROM (SELECT cl.СlientId AS cid, cl.NAME AS cname, LEFT(co.ContractNum,4) AS contr
	  FROM @Clients cl 
	  JOIN @Contracts co ON cl.СlientId = co.СlientId) AS T
PIVOT (COUNT(contr) FOR contr IN ([2600],[2605])) AS P;
11 май 12, 01:59    [12533715]     Ответить | Цитировать Сообщить модератору
 Re: простой запрос (подсчет значений)  [new]
rector
Member

Откуда: Киев
Сообщений: 57
Gust12,

ANSI, отработает красиво и везде:

SELECT 
		c.[NAME],
		SUM (CASE LEFT (con.ContractNum,4) WHEN '2600' THEN 1 ELSE 0 END) AS '2600',
		SUM (CASE LEFT (con.ContractNum,4) WHEN '2605' THEN 1 ELSE 0 END) AS '2605' 
FROM @Clients c 
JOIN @Contracts con ON c.СlientId=con.СlientId
GROUP BY c.[NAME]         
11 май 12, 13:30    [12535964]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить