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

Откуда:
Сообщений: 23
Есть представление MyView возвращающее (например) три поля

Days Shift Month
1
2
3
4
5
6
...
1
2
3
5
6
...
1
2
3
...
16 сен 14, 15:11    [16581445]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
alex_forw
Member

Откуда:
Сообщений: 23
Прошу прощение, не дописал задачу, браузер подшутил...

Есть представление MyView возвращающее (например) три поля

Days Shift Month
1........1.......8
2........3.......8
3........2.......8
4........2.......8
5........3.......8
6........2.......8
... ... ...
1........3.......8
2........1.......8
3........1.......8
5........1.......8
6........2.......8
... ... ...
1........2.......9
2........3.......9
3........3.......9
... ... ...


Задача следующая: выбрать Days (без повторений), Сопоставить им в три поля Count(Shift) Where Shift = 1 (повторить 2 и 3) И все это в определенном месяце Month
Пока нет вложений, все просто:

Select Days, Count(Shift)
From MyView 
Where Shift = 1 and Month = 8
Group by Days 


Но тогда для каждого Shift (1,2,3) придется повторять запрос трижды.
А с вложенными получается ерунда. И жоинами игрался и... в общем, не осилил.
БОЛЕЕ ТОГО, если, например Days с номером 2 нечего сопоставить из Shift (1,2 или 3) оно, по понятным причинам, не отображается, а в идеале очень хотелось бы, чтобы Shift был со знаком 0

Как-то так...
16 сен 14, 15:30    [16581579]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
Glory
Member

Откуда:
Сообщений: 104760
SUM(CASE ...)/PIVOT
16 сен 14, 15:33    [16581598]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
alex_forw
Member

Откуда:
Сообщений: 23
SQL Server 2000
16 сен 14, 15:35    [16581609]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
Glory
Member

Откуда:
Сообщений: 104760
alex_forw
SQL Server 2000

ну так выберите подходящий для вашей версии вариант
16 сен 14, 15:36    [16581612]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
alex_forw
Member

Откуда:
Сообщений: 23
Glory,

Игрался и с CASE но, увы. Если кто может помочь конкретным примером, буду благодарен.
16 сен 14, 15:39    [16581633]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
Glory
Member

Откуда:
Сообщений: 104760
alex_forw
Игрался и с CASE но, увы.

Надо играться с SUM(CASE ...)
16 сен 14, 15:40    [16581640]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
alex_forw
Member

Откуда:
Сообщений: 23
Glory,

ОК, спасибо. Пойду дерзать)
16 сен 14, 15:42    [16581650]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
alex_forw
Member

Откуда:
Сообщений: 23
Glory,

Еще одна проблема. Поле Shift - текстовое, там много хлама но зная конкретную позицию, с помощью SubString я вытягиваю нужное мне число (1,2,3)

Когда я пытаюсь преобразовать его в int
sum(Case When cast(SubString(MyView.Shift, 14,1) as int) = 1 then...........


Получаю месседж: The sum or average aggregate operation cannot take a varchar data type as an argument
16 сен 14, 15:53    [16581720]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
Glory
Member

Откуда:
Сообщений: 104760
alex_forw
Получаю месседж: The sum or average aggregate operation cannot take a varchar data type as an argument

1. Этот месседж не про "я пытаюсь преобразовать его в int "
2. Зачем преобразовывать ?
16 сен 14, 15:57    [16581741]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
alex_forw
Получаю месседж: The sum or average aggregate operation cannot take a varchar data type as an argument


А что после then ?
16 сен 14, 15:58    [16581746]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
alex_forw
Member

Откуда:
Сообщений: 23
a_voronin
alex_forw
Получаю месседж: The sum or average aggregate operation cannot take a varchar data type as an argument


А что после then ?


И это правильный вопрос) Мой недосмотр...
16 сен 14, 16:00    [16581767]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
alex_forw
Member

Откуда:
Сообщений: 23
Glory,

Да-а-а-а... Век живи...
Пол дня голову ковырял, а ларчик просто открывался:

Select Days, 
isnull(sum(Case When SubString(MyView.Shift, 14,1) = '1' then 1
end), '0') as Sh1,
...
Where Month = 8
Group by Days


ВСЕМ ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ! :)
16 сен 14, 16:16    [16581857]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
Glory
Member

Откуда:
Сообщений: 104760
У вас какая то мания к лищним преобразованиям типов
isnull(sum(Case When SubString(MyView.Shift, 14,1) = '1' then 1 end), '0')
isnull(sum(Case When SubString(MyView.Shift, 14,1) = '1' then 1 end), 0)

Сообщение было отредактировано: 16 сен 14, 16:18
16 сен 14, 16:18    [16581877]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
alex_forw
Member

Откуда:
Сообщений: 23
Glory,

Не совсем понимаю, в чем она выражается. Я же убрал cast
16 сен 14, 16:21    [16581894]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
Glory
Member

Откуда:
Сообщений: 104760
alex_forw
Glory,

Не совсем понимаю, в чем она выражается. Я же убрал cast

Найдите десять отличий между
isnull(sum(Case When SubString(MyView.Shift, 14,1) = '1' then 1 end), '0')
и
isnull(sum(Case When SubString(MyView.Shift, 14,1) = '1' then 1 end), 0)
16 сен 14, 16:33    [16581966]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
alex_forw
Member

Откуда:
Сообщений: 23
Glory,

А, вы о '0' и 0. Понял)))
16 сен 14, 16:48    [16582069]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
alex_forw
Member

Откуда:
Сообщений: 23
Glory,

Хм. Появилась еще одна идея, полученный результат "развернуть".
Пример:

Days..Sh1..Sh2..Sh3
1........2......5.....3
2........3......4.....1
3........1......2.....8

Превратить в:

1........2.......3 - это у нас станет "типа" Days
============
2........3.......1
5........4.......2
3........1.......8

Это вообще реально?
16 сен 14, 19:20    [16582743]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
Glory
Member

Откуда:
Сообщений: 104760
alex_forw
Это вообще реально?

В сымсле вместо as Sh1 написать as 1 ?
16 сен 14, 19:22    [16582747]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
alex_forw
Member

Откуда:
Сообщений: 23
Glory,

Нет))) Посмотрите, пожалуйста, примеры "ДО" и "ПОСЛЕ"
Где было 1...2...5...3
А должно стать
1
2
5
3

В общем, еще раз гляньте, пожалуйста, пример, я там максимально наглядно попытался объяснить :)
16 сен 14, 19:27    [16582756]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
Glory
Member

Откуда:
Сообщений: 104760
alex_forw
Где было 1...2...5...3
А должно стать
1
2
5
3

Зачем сначала делать "пивот", чтобы тут же делать "ан-пивот" ?
16 сен 14, 19:32    [16582768]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
alex_forw
Member

Откуда:
Сообщений: 23
Glory,

Данные в MyView уже были собраны в паре полей со свободным кол-вом строк. Я их никуда "не пивотил", просто, групировал. А развернуть хочу для удобства.
Был выбор между тем запросом который обсуждался ранее + новый для "разворота" результата, так мы получим 3 десятка полей - ГУД.
Или написать 3 десятка простых запросов - not ГУД)

Я УЧУСЬ, пытаюсь пробовать (спрашиваю) что-то новое, плодить миллион простых запросов мне не интересно :)
16 сен 14, 19:43    [16582802]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
Glory
Member

Откуда:
Сообщений: 104760
alex_forw
Я их никуда "не пивотил", просто, групировал.

А это что тогда ?
Select Days, 
isnull(sum(Case When SubString(MyView.Shift, 14,1) = '1' then 1
end), '0') as Sh1,
...
Where Month = 8
Group by Days

Зачем вы сначала делаете 2......5.....3, если тут же надо получить обратно
2
5
3
16 сен 14, 19:51    [16582820]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
alex_forw
Member

Откуда:
Сообщений: 23
Glory,

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

1) ID сотрудника
2) Дни (от 28 до 31)
3) Смены - Содержатся в разном мусоре (12:00 16:00 (3)), среди которого есть нужный мне числовой ID (в данном случае - 3), который я вытягиваю СабСтрингом (1,2,3)
4) Месяц
..
и тд.

Каждый сотрудник в представлении имеет свой набор рабочего времени и смен.
Таким образом: (Кол-во сотрудников * на 28..31 = множество строк)
Моя задача была подсчитать кол-во 1,2,3-й смен за каждый отдельный день по всем сотрудникам. Я (мы с вами) с ней справились. Таким образом, сотни строк были сокращены до 31-й Теперь, для удобства восприятия я хочу "развернуть" результат, положив отдельный ДБГрид под основную таблицу с графиками в программе. Мне нужно 31 поле и три строки (смены) в каждом.

Надеюсь, логика моих изощрений понятна :)
16 сен 14, 20:07    [16582840]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с вложенным запросом из представления  [new]
Glory
Member

Откуда:
Сообщений: 104760
alex_forw
Мне нужно 31 поле и три строки (смены) в каждом.

И что мешает сделать 31 раз SUM(CASE) ?
Или вы думаете, что эта другая задача ?
16 сен 14, 20:09    [16582844]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить