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

Откуда:
Сообщений: 450
Доброго времени суток!
Имеются таблицы
CREATE TABLE [dbo].[t_crm_jump_name](
	[id] [int] NOT NULL,
	[name] [varchar](50) COLLATE Cyrillic_General_CI_AS NULL,
 CONSTRAINT [PK_t_crm_jumps] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]


CREATE TABLE [dbo].[t_crm_jumps](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[id_jump] [int] NOT NULL,
	[begin_time] [datetime] NULL,
	[end_time] [datetime] NULL,
	[anumber] [varchar](15) COLLATE Cyrillic_General_CI_AS NOT NULL,
) ON [PRIMARY]

ALTER TABLE [dbo].[t_crm_jumps]  WITH CHECK ADD  CONSTRAINT [FK_t_crm_jump_t_crm_jump_name] FOREIGN KEY([id_jump])
REFERENCES [dbo].[t_crm_jump_name] ([id])

С помощью запроса
select begin_time,  count(*) from t_crm_jumps	t
join t_crm_jump_name t1 on t.id_jump = t1.id
 where begin_time between '20110707' and '20110707 14:50:11'
group by begin_time, t1.name
подсчитываю количество строк для определенного наименования t1.name

Подскажите, пожалуйста, как исправить запрос, что бы в резалтсете оказались значения для всех t1.name имеющихся в таблице с псевдонимом t1, даже если для них нет записей в таблице с псевдонимом t. Left/right join почему то не срабатывает...
7 июл 11, 15:44    [10939830]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
select begin_time,  count(*) over (partition by begin_time, t1.name) 
from t_crm_jumps	t
join t_crm_jump_name t1 on t.id_jump = t1.id
 where begin_time between '20110707' and '20110707 14:50:11'
7 июл 11, 15:46    [10939840]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
Volodya
Member

Откуда:
Сообщений: 450
Получил такой резалтсет

begin_time (No column name)
2011-07-07 1


но ведь в таблице t1 десять наименований, правда для остальных девяти нет записей в таблице t. Хотелось бы чтобы для остальных выводился либо null либо 0

Типа такого

begin_time (No column name) (No column name)
2011-07-07 1 0
7 июл 11, 15:57    [10939923]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
Запрос_по_подсчету
Guest
Volodya,

если записей нет в t, то begin_time is null
может, стоит добавить это в where?
7 июл 11, 16:10    [10940033]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
select begin_time,  count(*)
from t_crm_jumps	t
right join t_crm_jump_name t1 on t.id_jump = t1.id
and begin_time between '20110707' and '20110707 14:50:11'
group by begin_time, t1.name
???
7 июл 11, 16:14    [10940075]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
Запрос_по_подсчету
Guest
iap,
а count(*) не вернет 1 для строк, где нет записей в t?

MS под рукой нету...
7 июл 11, 16:20    [10940125]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Запрос_по_подсчету
iap,
а count(*) не вернет 1 для строк, где нет записей в t?

MS под рукой нету...
Вернёт. А что, не надо?
Тогда вместо COUNT(*) - COUNT(t.id)
7 июл 11, 16:27    [10940203]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Я бы ещё порядок таблиц в джойне поменял и написал вместо RIGHT JOIN - LEFT JOIN
Привычнее как-то...
7 июл 11, 16:36    [10940276]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
Я бы ещё порядок таблиц в джойне поменял и написал вместо RIGHT JOIN - LEFT JOIN
Привычнее как-то...
Да! И обязательно надо писать алиасы таблиц у полей. IMHO
А то про begin_time так сразу и не скажешь, из какой таблицы берётся (если бы скриптов не было)
7 июл 11, 16:42    [10940326]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
Volodya
Member

Откуда:
Сообщений: 450
Так я в самом первом посте пишу, что left\right join не срабатывает...
а вот begin_time is null нужно попробовать. Спасибо.
7 июл 11, 20:02    [10941521]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Volodya
left\right join не срабатывает...
Значит, всё!
Весь MS SQL Server - в топку!

Сообщите Биллу сами, пожалуйста!
7 июл 11, 21:25    [10941785]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Volodya,

А Вы не в курсе, что обычно происходит,
когда в WHERE накладывают ограничения на поля левой таблицы RIGHT JOIN?
И, может быть, Вы внимательнее посмотрите на предлагаемые в Вашем запросе изменения (я их даже выделил)?
7 июл 11, 21:28    [10941801]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
Volodya
Member

Откуда:
Сообщений: 450
Простите меня пожалуйста
7 июл 11, 21:49    [10941884]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
Volodya
Member

Откуда:
Сообщений: 450
Доброго времени суток!
Почитал теорию и слепил запрос. Вот этот запрос выдает то, что мне требуется. Может быть можно этот запрос написать оптимальней?

select t.t, t.v, isnull(t1.v, 0)  as v1 from
(
select convert(varchar(10), begin_time, 112) t, count(*) v from t_crm_jumps	
where begin_time between '20110704' and '20110707 14:50:11' and id_jump = 1
group by convert(varchar(10), begin_time, 112) 
) t
left join (
select convert(varchar(10), begin_time, 112) t, count(*) v from t_crm_jumps	
where begin_time between '20110704' and '20110707 14:50:11' and id_jump = 20
group by convert(varchar(10), begin_time, 112) ) t1 on t.t = t1.t


Результат

t	           v	   v1
20110704           2	    0
20110707           8	    0 
8 июл 11, 09:07    [10943014]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
Volodya
Member

Откуда:
Сообщений: 450
sql server 2005
8 июл 11, 09:09    [10943023]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Volodya, в принципе можно. В каунтах - кейс, оба фильтра в один.
8 июл 11, 09:13    [10943037]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
Volodya
Member

Откуда:
Сообщений: 450
kDnZP,
можно подробнее?
8 июл 11, 09:18    [10943054]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Volodya, что-то типа такого, не проверял.
SELECT  CONVERT(VARCHAR(10), begin_time, 112) t,
        SUM(CASE WHEN id_jump = 1 THEN 1
            END) v,
        SUM(CASE WHEN id_jump = 20 THEN 1
            END) v1
FROM    t_crm_jumps
WHERE   begin_time BETWEEN '20110704'
                   AND     '20110707 14:50:11'
        AND id_jump IN ( 1, 20 )
GROUP BY begin_time
8 июл 11, 09:19    [10943055]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
Volodya
Member

Откуда:
Сообщений: 450
запрос работает, но у меня тут еще и уникальных абонентов нужно посчитать...
select convert(varchar(10), begin_time, 112) date, count(*) n, [color=red]count(distinct anumber) dn [/color]from t_crm_jumps	
where begin_time between '20110704' and '20110707 14:50:11' and id_jump = 1
group by convert(varchar(10), begin_time, 112) 
как тут с кейсами быть?
8 июл 11, 09:35    [10943141]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
Volodya
Member

Откуда:
Сообщений: 450
вот это выделить красным хотел

count(distinct anumber) dn
8 июл 11, 09:35    [10943145]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
Volodya
Member

Откуда:
Сообщений: 450
вот такой запрос пока получился
select t.date, t.n, t.dn
	, isnull(t1.n, 0) as n1, isnull(t1.dn, 0) as dn1 
	, isnull(t2.n, 0) as n2, isnull(t2.dn, 0) as dn2 
from
(
select convert(varchar(10), begin_time, 112) date, count(*) n, count(distinct anumber) dn from t_crm_jumps	
where begin_time between '20110704' and '20110707 14:50:11' and id_jump = 1
group by convert(varchar(10), begin_time, 112) 
) t
left join (
select convert(varchar(10), begin_time, 112) date, count(*) n, count(distinct anumber) dn from t_crm_jumps	
where begin_time between '20110704' and '20110707 14:50:11' and id_jump = 20
group by convert(varchar(10), begin_time, 112) 
			) t1 on t.date = t1.date
left join (
select convert(varchar(10), begin_time, 112) date, count(*) n, count(distinct anumber) dn from t_crm_jumps	
where begin_time between '20110704' and '20110707 14:50:11' and id_jump = 30
group by convert(varchar(10), begin_time, 112) 
			) t2 on t.date = t2.date
да еще сюда придется добавить с десяток объединений с разными id_jump
8 июл 11, 09:55    [10943277]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Volodya, мне честно говоря лень глядеть что вы там насчитали, а что в уме держите. Делайте как нравится))).
8 июл 11, 10:26    [10943545]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
Volodya
Member

Откуда:
Сообщений: 450
kDnZP, спасибо)))

Кому не лень, посмотрите пожалуйста, как можно сделать приведенный выше запрос лаконичней, красивей )))
8 июл 11, 10:33    [10943607]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
Запрос_по_подсчету
Guest
А чем Вам вариант с кейсом не по душе пришелся?
8 июл 11, 10:49    [10943754]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по подсчету записей в таблице  [new]
Volodya
Member

Откуда:
Сообщений: 450
а как в варианте с кейсом еще посчитать и вот это
count(distinct anumber)
8 июл 11, 10:53    [10943788]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить