Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > SQL Запрос на количество


Автор: Pankon 19.5.2006, 14:07
Есть таблица:
Код

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
 

Автор: skyboy 19.5.2006, 14:24
навскидку 
Код

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

Примитивно, однако ничего лучшего пока не пришло. Всё же лучше, чем два разных запроса бросать... 

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

Автор: Sqlninja 19.5.2006, 14:44
Код

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

 

Автор: Sqlninja 19.5.2006, 14:59
Это Oracle диалект, но Вы его переделаете без труда так как Вам нужно. 

Автор: Vit 19.5.2006, 15:48
Классика примерно такая:

Код

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]


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

  

Автор: Sqlninja 19.5.2006, 16:00
для Oracle стопудово работает. 

Автор: Pankon 19.5.2006, 17:12
Цитата(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  

Автор: Pankon 22.5.2006, 15:02
Работает не совсем так, как надо... !!!

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

Код

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  

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



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

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

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

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

DB - MS SQL



 

Автор: Akina 22.5.2006, 18:07
Смотри.

Первый запрос - получить 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]
 

Автор: Vit 22.5.2006, 19:11
Цитата(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]
  

Автор: Pankon 22.5.2006, 19:14
Цитата(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)

Спасибо
  

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



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

Автор: Pankon 23.5.2006, 14:31
Цитата(Vit @  22.5.2006,  19:15 Найти цитируемый пост)
Дык этот то что я привёл 


Спасибо еще раз... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)