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

Откуда: Sevastopol
Сообщений: 12
Вообще, всё это нужно для того, чтобы получить сколько уникальных записей (если все параметры одинаковые - считаем все эти записи как одну) сделано за последние, пусть, 2 месяца.

Таблицу упрощаю:
Table
id      date     prop1      prop2       prop3
----------------------------------------
1  2009-10-23    as          dim          rt
2  2009-10-26    as          gg           rt
3  2009-10-22    as          dim          rt
4  2009-11-20    dd          gg           ww
5  2009-11-29    as          dim          uu

В низу топика у нас должно получится 2 строки на каждый месяц:
date         count
-----------------
2009-10       2
2009-11       2

Ну дату я переверну для группировки как-то так:
left(convert(varchar(6), date, 112), 4) + '-' + right(convert(varchar(6), date, 112), 2)

Ну выведу я за определенный месяц уникальные строки как-то так:
SELECT prop1 FROM Table t 
	GROUP BY prop1
		, prop2
		,left(convert(varchar(6), t.date, 112), 4) + '-' + right(convert(varchar(6), t.date, 112), 2)
		,prop3
-- дальше показываем, что нас интересует только данные, где дата начинается с "2009-10"
	HAVING left(convert(varchar(6), t.date, 112), 4) + '-' + right(convert(varchar(6), t.date, 112), 2)
			=left(convert(varchar(6), dateadd(month,-1,GETDATE()), 112), 4) + '-' + right(convert(varchar(6), dateadd(month,-1,GETDATE()), 112), 2)

Ну получу я результат по прошлому месяцу такого плана (по текущему такойже результат будет по моим тестовым данным):
prop1
-------
as
as

А как-же получить COUNT строк последнего запроса (что строки две) что-то притормаживаю, не подскажите?

Кто думает на SQL, может проще что подскажет или хоть куда копать?
31 окт 09, 00:08    [7865645]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать COUNT всех строк, что вернул SELECT .... GROUP BY ..  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36806
@@rowcount
31 окт 09, 00:12    [7865656]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать COUNT всех строк, что вернул SELECT .... GROUP BY ..  [new]
Zeiman
Member

Откуда: Sevastopol
Сообщений: 12
Гавриленко Сергей Алексеевич
@@rowcount


Получается как-то так:

DECLARE @Month1 int
DECLARE @Month2 int
--...

SELECT prop1 FROM Table t 
	GROUP BY prop1
		, prop2
		,left(convert(varchar(6), t.date, 112), 4) + '-' + right(convert(varchar(6), t.date, 112), 2)
		,prop3
-- дальше показываем, что нас интересует только данные, где дата начинается с "2009-10"
	HAVING left(convert(varchar(6), t.date, 112), 4) + '-' + right(convert(varchar(6), t.date, 112), 2)
			=left(convert(varchar(6), dateadd(month,-1,GETDATE()), 112), 4) + '-' + right(convert(varchar(6), dateadd(month,-1,GETDATE()), 112), 2)

SET @Month1=@@rowcount

--Тоже самое со вторым месяцем.. и с остальными
--...
SET @Month2=@@rowcount

SELECT left(convert(varchar(6), dateadd(month,0,GETDATE()), 112), 4) + '-' + right(convert(varchar(6), dateadd(month,0,GETDATE()), 112), 2) As CurMonth
, @Month1 As Month1
UNION
SELECT left(convert(varchar(6), dateadd(month,-1,GETDATE()), 112), 4) + '-' + right(convert(varchar(6), dateadd(month,-1,GETDATE()), 112), 2) As CurMonth
, @Month2 As Month2

Как-то криво получается - лишние SELECT'ы возвращаются в запросе, как их убрать? Как-то по другому надо :(
31 окт 09, 00:34    [7865709]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать COUNT всех строк, что вернул SELECT .... GROUP BY ..  [new]
Yadrinez
Member

Откуда: :адуктО
Сообщений: 360
SELECT date,prop1,prop2,prop3
COUNT(date) OVER (PARTITION BY date,prop1,prop2,prop3) [количество]
FROM postclnt
На дату можно добавить условие
Убрать лишние дубляжи
31 окт 09, 01:31    [7865795]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать COUNT всех строк, что вернул SELECT .... GROUP BY ..  [new]
Yadrinez
Member

Откуда: :адуктО
Сообщений: 360
SELECT date,prop1,prop2,prop3,
COUNT(date) OVER (PARTITION BY date,prop1,prop2,prop3) [количество]
FROM postclnt

Запятую забыл
31 окт 09, 01:32    [7865797]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать COUNT всех строк, что вернул SELECT .... GROUP BY ..  [new]
Zeiman
Member

Откуда: Sevastopol
Сообщений: 12
Yadrinez
SELECT date,prop1,prop2,prop3,
COUNT(date) OVER (PARTITION BY date,prop1,prop2,prop3) [количество]
FROM postclnt

Спасибо, но кажется, что это как свой GROUP BY, только для COUNT(*), и проблемы не решит (или я не пойму как, всё равно группировать вроде надо и считать строки). Он даст тоже самое, если в вышекинутый запрос с GROUP BY запросить COUNT(*) - тогда покажет сколько в каждой строчке нагруппировало.
Это если бы как-то так можно было:

SELECT COUNT(*) FROM (
SELECT prop1 FROM Table t 
	GROUP BY prop1
		, prop2
		,left(convert(varchar(6), t.date, 112), 4) + '-' + right(convert(varchar(6), t.date, 112), 2)
		,prop3
	HAVING left(convert(varchar(6), t.date, 112), 4) + '-' + right(convert(varchar(6), t.date, 112), 2)
			=left(convert(varchar(6), dateadd(month,-1,GETDATE()), 112), 4) + '-' + right(convert(varchar(6), dateadd(month,-1,GETDATE()), 112), 2) 
) As CountFor1Month 
--...
Тогда - бы двойку вернуло для одного месяца и осталось-бы только с'UNION'ить два или более месяцев, но даже так пока не известно как сделать:(
Репорт, конечно уже выложил, в вышеподсказанном виде с кучей DECLARE и @@rowcount, но спать буду криво, пока не поправлю.
Так что если есть варианты - тема будет очень рада.
31 окт 09, 03:30    [7865836]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать COUNT всех строк, что вернул SELECT .... GROUP BY ..  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Zeiman
Yadrinez
SELECT date,prop1,prop2,prop3,
COUNT(date) OVER (PARTITION BY date,prop1,prop2,prop3) [количество]
FROM postclnt

Спасибо, но кажется, что это как свой GROUP BY, только для COUNT(*), и проблемы не решит (или я не пойму как, всё равно группировать вроде надо и считать строки). Он даст тоже самое, если в вышекинутый запрос с GROUP BY запросить COUNT(*) - тогда покажет сколько в каждой строчке нагруппировало.
Это если бы как-то так можно было:

SELECT COUNT(*) FROM (
SELECT prop1 FROM Table t 
	GROUP BY prop1
		, prop2
		,left(convert(varchar(6), t.date, 112), 4) + '-' + right(convert(varchar(6), t.date, 112), 2)
		,prop3
	HAVING left(convert(varchar(6), t.date, 112), 4) + '-' + right(convert(varchar(6), t.date, 112), 2)
			=left(convert(varchar(6), dateadd(month,-1,GETDATE()), 112), 4) + '-' + right(convert(varchar(6), dateadd(month,-1,GETDATE()), 112), 2) 
) As CountFor1Month 
--...
Тогда - бы двойку вернуло для одного месяца и осталось-бы только с'UNION'ить два или более месяцев, но даже так пока не известно как сделать:(
Репорт, конечно уже выложил, в вышеподсказанном виде с кучей DECLARE и @@rowcount, но спать буду криво, пока не поправлю.
Так что если есть варианты - тема будет очень рада.

1. Xnj
31 окт 09, 16:29    [7866626]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать COUNT всех строк, что вернул SELECT .... GROUP BY ..  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
Zeiman
Yadrinez
SELECT date,prop1,prop2,prop3,
COUNT(date) OVER (PARTITION BY date,prop1,prop2,prop3) [количество]
FROM postclnt

Спасибо, но кажется, что это как свой GROUP BY, только для COUNT(*), и проблемы не решит (или я не пойму как, всё равно группировать вроде надо и считать строки). Он даст тоже самое, если в вышекинутый запрос с GROUP BY запросить COUNT(*) - тогда покажет сколько в каждой строчке нагруппировало.
Это если бы как-то так можно было:

SELECT COUNT(*) FROM (
SELECT prop1 FROM Table t 
	GROUP BY prop1
		, prop2
		,left(convert(varchar(6), t.date, 112), 4) + '-' + right(convert(varchar(6), t.date, 112), 2)
		,prop3
	HAVING left(convert(varchar(6), t.date, 112), 4) + '-' + right(convert(varchar(6), t.date, 112), 2)
			=left(convert(varchar(6), dateadd(month,-1,GETDATE()), 112), 4) + '-' + right(convert(varchar(6), dateadd(month,-1,GETDATE()), 112), 2) 
) As CountFor1Month 
--...
Тогда - бы двойку вернуло для одного месяца и осталось-бы только с'UNION'ить два или более месяцев, но даже так пока не известно как сделать:(
Репорт, конечно уже выложил, в вышеподсказанном виде с кучей DECLARE и @@rowcount, но спать буду криво, пока не поправлю.
Так что если есть варианты - тема будет очень рада.

1. Xnj
Извините, нажал чего-то случайно...

1. Что это за фигня такая, простите за выражение:
left(convert(varchar(6), t.date, 112), 4) + '-' + right(convert(varchar(6), t.date, 112), 2)
? Чем
CONVERT(VARCHAR(7),t.date,120)
не устроило?
2. Почему условие сидит в HAVING, а не в WHERE?
Если не ошибаюсь, оно там для того, чтобы оставить только строки прошлого месяца?
Тогда лучше так:
SELECT COUNT(*)
FROM
(
 SELECT prop1
 FROM [Table] t
 WHERE t.[date]>=DATEADD(MONTH, DATEDIFF(MONTH,0, GETDATE())-1,0)
   AND t.[date]<DATEADD(MONTH, DATEDIFF(MONTH,0, GETDATE()),0)
 GROUP BY prop1, prop2, prop3
) As CountFor1Month
--...
IMHO
3. Нужно-то вот это?
SELECT M [Month], COUNT(*) FROM
(
 SELECT DISTINCT CONVERT(CHAR(7),t.[date],120),prop1,prop2,prop3
 FROM [Table] t
 WHERE t.[date]>=DATEADD(MONTH, DATEDIFF(MONTH,0, GETDATE())-2,0)
  AND t.[date]<DATEADD(MONTH, DATEDIFF(MONTH,0, GETDATE()),0)
) Properties(M,prop1,prop2,prop3)
GROUP BY M
ORDER BY M;
Это если надо посчитать за два предыдущих месяца
31 окт 09, 16:58    [7866663]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать COUNT всех строк, что вернул SELECT .... GROUP BY ..  [new]
Zeiman
Member

Откуда: Sevastopol
Сообщений: 12
iap
Нужно-то вот это?

Да, действительно красиво - сразу так не подумал сделать, спасибо большое за ваши большие и добрые дела.
15 ноя 09, 21:03    [7931289]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить