Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SQL Запрос на количество, 2 раза count? 
V
    Опции темы
Pankon
Дата 19.5.2006, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



Есть таблица:
Код

ID  Date        Value
1   12.12.2006  a
2   12.12.2006  b
3   12.12.2006  b
4   13.12.2006  a
5   13.12.2006  b
6   13.12.2006  a
7   13.12.2006  a

Мне нужен запрос, который дает:
Код

Date       Count_All     Count_b
12.12.2006  3               2
13.12.2006  4               1
 
PM MAIL   Вверх
skyboy
Дата 19.5.2006, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 5
Всего: 260



навскидку 
Код

select date,count(*) from <table> group by date
union all
select date,count(*) from <table> where value="b" group by date

Примитивно, однако ничего лучшего пока не пришло. Всё же лучше, чем два разных запроса бросать... 
PM MAIL   Вверх
boevik
Дата 19.5.2006, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: 6
Всего: 35



skyboy, у тебя и есть два разных запроса и результат не в том виде который просили. 


--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
Sqlninja
Дата 19.5.2006, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: нет
Всего: 13



Код

SELECT x1.dd,
       x1.cc,
       x2.cc
FROM   (SELECT   TO_DATE (date_id, 'dd.mm.yyyy') dd,
                 COUNT (*) cc
        FROM     ttt
        GROUP BY TO_DATE (date_id, 'dd.mm.yyyy')) x1, (SELECT   TO_DATE (date_id, 'dd.mm.yyyy') dd,
                                                                COUNT (*) cc
                                                       FROM     ttt
                                                       WHERE    value_id = 'b'
                                                       GROUP BY TO_DATE (date_id, 'dd.mm.yyyy')) x2
WHERE  x2.dd = x1.dd

 


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
Sqlninja
Дата 19.5.2006, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: нет
Всего: 13



Это Oracle диалект, но Вы его переделаете без труда так как Вам нужно. 


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
Vit
Дата 19.5.2006, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Классика примерно такая:

Код

Select t.[date], t.Count_All, t2.Count_b
From 
 (Select [date], Count(*) as Count_All From MyTable Group By [Date]) as t
Left Outer Join 
 (Select [date], Count(*) as Count_b From MyTable Group By [Date] where Value='b') as t2 
  on t.[date]=t2.[date]



Для MS SQL Server можно попробовать и так:

Код

Select 
  [date], 
  Count(*) as Count_All,
  Sum(Case When Value='b' Then 1 Else 0 End) as  Count_b
From MyTable Group By [Date]


Второй вариант под вопросом, сервер может скушает такое а может нет.... И скорее всего второй вариант будет несколько медленнее.

  


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Sqlninja
Дата 19.5.2006, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: нет
Всего: 13



для Oracle стопудово работает. 


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
Pankon
Дата 19.5.2006, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



Цитата(Sqlninja @  19.5.2006,  14:59 Найти цитируемый пост)
переделаете без труда так как Вам нужно


Код

SELECT T1.Date, T1.Count_All, T2.Count_b
FROM [SELECT Date, Count(Tabelle3.Date) AS Count_All
FROM Tabelle3
GROUP BY Tabelle3.Date]. AS T1, [SELECT Tabelle3.Date, Count(Tabelle3.Value) AS Count_b
FROM Tabelle3
GROUP BY Tabelle3.Date, Tabelle3.Value
HAVING (Tabelle3.Value)="b"]. AS T2
WHERE T1.Date = T2.Date;

Работает.
Спасибо Sqlninja.

Vit может позже попробую и твой вариант (тоже Спасибо)

 smile  
PM MAIL   Вверх
Pankon
Дата 22.5.2006, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



Работает не совсем так, как надо... !!!

Если таблица имеет еще записи

Код

ID  Date        Value
...................
8   10.12.2006  c
9   10.12.2006  c
10  10.12.2006  c
11  10.12.2006  c

то результирующая таблица должна выглядеть
Код

Date       Count_All     Count_b
10.12.2006  4               0 
12.12.2006  3               2
13.12.2006  4               1

Как получить запись с нулем  smile  
PM MAIL   Вверх
Vit
Дата 22.5.2006, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Цитата(Pankon @  22.5.2006,  06:02 Найти цитируемый пост)
Как получить запись с нулем  



Разве мой код нулей не даёт???  


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Pankon
Дата 22.5.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



Цитата(Vit @  22.5.2006,  15:34 Найти цитируемый пост)
Разве мой код нулей

Да твой код работает лучше..., но дает NULL...
А как получить вместо NULL - 0 ?

Что-то вроде 
IIF(T2.Count_b=Null, 0 , T2.Count_b)....?

DB - MS SQL



 
PM MAIL   Вверх
Akina
Дата 22.5.2006, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Смотри.

Первый запрос - получить Count_All
Код

(Select [xDate], Count([xDate]) As [xCount]
 From MyTable
 Group By [xDate]
) As Q1


Второй запрос - получить Count_b
Код

(Select [xDate], Count([xDate]) As [xCount]
 From MyTable
 Where [xValue] = "b"
 Group By [xDate]
) As Q2

Теперь связываем их по полю даты и выгребаем нужные данные
Код

Select Q1.[xDate], Q1.[xCount] As Count_All, Q2.[xCount] As Count_b
From
(Select [xDate], Count([xDate]) As [xCount]
 From MyTable
 Group By [xDate]
) As Q1
JOIN
(Select [xDate], Count([xDate]) As [xCount]
 From MyTable
 Where [xValue] = "b"
 Group By [xDate]
) As Q2
ON Q1.[xDate]=Q2.[xDate]
 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Vit
Дата 22.5.2006, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Цитата(Pankon @  22.5.2006,  07:19 Найти цитируемый пост)
но дает NULL...
А как получить вместо NULL - 0 ?



IsNull(MyValue, 0)

Добавлено @ 19:13 
Код

Select t.[date], t.Count_All as CountAll, isNull(t2.Count_b,0) as Count_B
From 
 (Select [date], Count(*) as Count_All From MyTable Group By [Date]) as t
Left Outer Join 
 (Select [date], Count(*) as Count_b From MyTable Group By [Date] where Value='b') as t2 
  on t.[date]=t2.[date]
  


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Pankon
Дата 22.5.2006, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: нет
Всего: 5



Цитата(Akina @  22.5.2006,  18:07 Найти цитируемый пост)
Смотри.
Такой вариант предложил Sqlninja (точнее это был Vit smile) (и даже лучше - с "Left Outer Join")

A последний вопрос был 
Цитата(Pankon @  22.5.2006,  16:19 Найти цитируемый пост)
А как получить вместо NULL - 0 ?


Добавлено @ 19:15 
Цитата(Vit @  22.5.2006,  19:11 Найти цитируемый пост)

IsNull(MyValue, 0)

Спасибо
  

Это сообщение отредактировал(а) Pankon - 23.5.2006, 14:32
PM MAIL   Вверх
Vit
Дата 22.5.2006, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Цитата(Akina @  22.5.2006,  09:07 Найти цитируемый пост)
Теперь связываем их по полю даты и выгребаем нужные данные



Дык этот то что я привёл  smile  


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0634 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.