Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выражение СASE с рекурсивным запросом / 7 сообщений из 7, страница 1 из 1
26.08.2020, 11:45
    #39992482
Дмитрий86
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выражение СASE с рекурсивным запросом
Всем добрый день! Есть рекурсивный запрос:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
WITH rec_emp (emp_id) AS
( SELECT emp_id
  FROM Table1
  WHERE emp_id = 10
  UNION
  SELECT t.emp_id
  FROM Table1 t, rec_emp r
  WHERE 
   t.Empid = r.emp_id
)
, rec_dep (dep_id) AS
( SELECT dep_id
  FROM Table2
  WHERE dep_id= 110
  UNION
  SELECT k.dep_id
  FROM Table2 k, rec_dep rd
  WHERE 
   k.Depid = rd.dep_id
)
SELECT *
FROM Table3
WHERE DATE = '2020-02-02'
AND emp_id IN (SELECT emp_id FROM rec_emp) -- достаем айди сотрудников из первого запроса
AND dep_id IN (SELECT dep_id FROM rec_dep) -- достаем айди отделов из второго запроса



Нудно в селекте итоговом из таблицы3, вставить case-выражение:
Когда emp_id из табл3 равен значению 15 (всегда) emp_id из rec_emp, тогда вычислить такое выражение (SUM(Column1)/Sum(Column2) из табл3), во всех других случаях -- вычислить SUM(Column1) (тоже из табл3)

Мой вариант, но он нерабочий:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
WITH rec_emp (emp_id) AS
( SELECT emp_id
  FROM Table1
  WHERE emp_id = 15
  UNION
  SELECT t.emp_id
  FROM Table1 t, rec_emp r
  WHERE 
   t.Empid = r.emp_id
)
, rec_dep (dep_id) AS
( SELECT dep_id
  FROM Table2
  WHERE dep_id= 110
  UNION
  SELECT k.dep_id
  FROM Table2 k, rec_dep rd
  WHERE 
   k.Depid = rd.dep_id
)
SELECT  Column3, 
             CASE 
                   WHEN emp_id IN (SELECT emp_id FROM rec_emp WHERE emp_id = 15)
                   THEN SUM(Column1)/Sum(Column2)
                    ELSE SUM(Column1)
            END
FROM Table3
WHERE DATE = '2020-02-02'
AND dep_id IN (SELECT dep_id FROM rec_dep) -- достаем айди отделов из второго запроса


Подскажите пжлста что не так? Спасибо!
...
Рейтинг: 0 / 0
26.08.2020, 12:11
    #39992491
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выражение СASE с рекурсивным запросом
Хде group by кляуза?
Сервер телепатическими способностями пока не наделен.
...
Рейтинг: 0 / 0
26.08.2020, 12:14
    #39992493
Дмитрий86
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выражение СASE с рекурсивным запросом
дада забыл ее дописать
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT  Column3, 
             CASE 
                   WHEN emp_id IN (SELECT emp_id FROM rec_emp WHERE emp_id = 15)
                   THEN SUM(Column1)/Sum(Column2)
                    ELSE SUM(Column1)
            END
FROM Table3
WHERE DATE = '2020-02-02'
AND dep_id IN (SELECT dep_id FROM rec_dep)
group by 1
order by 1
...
Рейтинг: 0 / 0
26.08.2020, 12:47
    #39992531
Guf
Guf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выражение СASE с рекурсивным запросом
Дмитрий86,

В group by надо перечислять столбцы . 1 - не канает
sum должен содержать внутри себя весь case
Код: sql
1.
WHEN emp_id IN (SELECT emp_id FROM rec_emp WHERE emp_id = 15)


что за изврат?!
тебе нужно что-типа:
Код: sql
1.
2.
3.
...
, sum(Column1) / isnull(sum(case emp_id when 15 then Column2 end), 1)
...
...
Рейтинг: 0 / 0
26.08.2020, 15:57
    #39992588
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выражение СASE с рекурсивным запросом
Guf

что за изврат?!
тебе нужно что-типа:
Код: sql
1.
2.
3.
...
, sum(Column1) / isnull(sum(case emp_id when 15 then Column2 end), 1)
...



Ему нужен

Код: sql
1.
sum(Column1) / NULLIF(sum(case emp_id when 15 then Column2 end), 0)
...
Рейтинг: 0 / 0
26.08.2020, 16:19
    #39992600
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выражение СASE с рекурсивным запросом
Код: plsql
1.
WHEN emp_id IN (SELECT emp_id FROM rec_emp WHERE emp_id = 15)


И чем это отличается от
Код: plsql
1.
WHEN emp_id = 15


???
...
Рейтинг: 0 / 0
26.08.2020, 16:43
    #39992616
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выражение СASE с рекурсивным запросом
SQL2008
И чем это отличается от
Код: plsql
1.
WHEN emp_id = 15



???
Тем, что в rec_emp может не быть строк с emp_id = 15.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выражение СASE с рекурсивным запросом / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]