Помогите с запросом в MS SQL :)
3938
14
С sql не очень сильно дружу:улыб:
Есть такая выборка:

Date ID

13.11.09 3
13.11.09 1
14.11.09 1
13.11.09 3
13.11.09 2
14.11.09 2
13.11.09 3

Как из такой выборки получить такую:
Date Кол-во ID1 Кол-во ID2 Кол-во ID3
13.11.09 1 1 3
14.11.09 1 1 0

Т.е. сколько тот или иной ID встречался в эту дату.
hamster
select Date_id, ID, sum(ID) from table
group by ID, Date_id
как-то так
hamster
имхо Вы не только с sql не дружите
У Вас
1)исходные данные в цифрах
Date ID

13.11.09 3
13.11.09 1
14.11.09 1
13.11.09 3
13.11.09 2
14.11.09 2
13.11.09 3
2)пример результат в цифрах,
Date Кол-во ID1 Кол-во ID2 Кол-во ID3
13.11.09 1 1 3
14.11.09 1 1 0
3)словесное описаниене
Т.е. сколько тот или иной ID встречался в эту дату.
не согласуются между собой ни в каких сочетаниях
мыслимых сочетаниях
craxx
select Date_id, ID, sum(ID) from table
group by ID, Date_id
Пипец... К плохим програмистам точно на новый год приходит не Дед Мороз, а Дид Лок...
Просто очень познавательна конструкция sum(ID) в свете group by ID.
Нафига так позориться-то??
craxx
Спасибо за помощь:улыб:Получился вывод:

Date ID COUNT(ID)
15.11.09 2 3
16.11.09 1 3
16.11.09 3 3

Т.е. выбрались записи с ID равным 1,2,3

А мне бы хотелось чтобы вывод выглядел так:

Date ID == 1 ID == 2 ID == 3
15.11.09 0 3 0
16.11.09 3 0 3

Т.е. напрмер 15-го числа было 0 ID равных 1, 3 ID равных 2 и 0 ID равных 3
hamster
не, в таком виде средствами SQL в общем случае не решаемо - потому что количество полей запроса заранее неизвестно
Хотя если ты знаешь максимальный ID в запросе, то можно через внутренние объединения к одной и той же таблице - но это громоздко получится
hamster
Количество ID заранее известно?
Sadovnikov
Количество ID заранее известно?
ид можно посчитать и курсором в строку, а потом:
Select date, strID
From
(Select date, id
from Table) as H
Pivot
(count(id)
for id in (srtID)
) as Pvt
zeus
1. "курсором в строку" - и рискуем нарваться на ограничения, например, по длине тектста запроса, если этих ID вдруг окажется слишком много.
2. "Pivot" - а если у автора 2000-ный скуль? :миг:
hamster
Тогда, например, так:

Create Table Z (_Date DateTime, ID Int)

Insert Into Z Values('20010101', 1)
Insert Into Z Values('20010101', 2)
Insert Into Z Values('20010101', 2)
Insert Into Z Values('20010101', 2)
Insert Into Z Values('20010101', 2)
Insert Into Z Values('20010101', 3)

Insert Into Z Values('20020101', 1)
Insert Into Z Values('20020101', 3)

Insert Into Z Values('20030101', 1)
Insert Into Z Values('20030101', 2)
Insert Into Z Values('20030101', 3)

Insert Into Z Values('20040101', 3)
Insert Into Z Values('20050101', 3)

Select
_Date, SUM(ID_1) ID_1, SUM(ID_2) ID_2, SUM(ID_3) ID_3
From
(
Select
_Date,
(CASE When ID = 1 Then 1 Else 0 End) ID_1,
(CASE When ID = 2 Then 1 Else 0 End) ID_2,
(CASE When ID = 3 Then 1 Else 0 End) ID_3
From Z
) Z
Group By _Date

Drop Table Z
hamster
Известно 3 штуки
ну а если 2005ый то можно так.
Pivot альтернатива case из-за которого запрос выглядит слишком запутанным.
Select date, :1:,[2],[3]
From
(Select date, id
from Table) as H
Pivot
(count(id)
for id in ( :1:,[2],[3])
) as Pvt
zeus
А форум вот так: :1: подсказывает, что не надо так делать...:улыб:
P.S. Я к тому, что не у всех 2005-й скуль:улыб:
Sadovnikov
А форум вот так: :1: подсказывает, что не надо так делать...:улыб:P.S. Я к тому, что не у всех 2005-й скуль:улыб:
конечно, у некоторых уже 2008ой. :улыб: