SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 18.04.2017 07:47:07

Marina_A
Участник
Зарегистрирован: 14.03.2017
Сообщений: 19

Запрос в несколько таблиц,с разным названием столбцов

Существует 4 таблицы:
INCIDENTS, REQUEST, CHANGE, PROBLEM


Из каждой необходимо вынести Группу и сколько было открыто и закрыто задач этой группой.

Колонка Группа в каждой таблице называется по-разному, к примеру:



в таблице INCIDENTS:

SELECT ASSIGNMENT
                                 ,  OpenedCount = sum( iif( OPEN_TIME >=  @StartDate and OPEN_TIME < @EndDate + 1, 1, 0 ) )
                                 ,  ClosedCount  = sum( iif( CLOSE_TIME >=  @StartDate and OPEN_TIME < @EndDate + 1, 1, 0 ) )
                           FROM [dbo].[INCIDENTS]
                           GROUP BY ASSIGNMENT
                           ORDER BY ASSIGNMENT

в таблице CHANGE:

SELECT ASSIGN_DEPT
                                 ,  OpenedCount = sum( iif( OPEN_TIME >=  @StartDate and OPEN_TIME < @EndDate + 1, 1, 0 ) )
                                 ,  ClosedCount  = sum( iif( CLOSE_TIME >=  @StartDate and OPEN_TIME < @EndDate + 1, 1, 0 ) )
                           FROM [dbo].[CHANGE]
                           GROUP BY ASSIGN_DEPT
                           ORDER BY ASSIGN_DEPT



в таблице PROBLEM:

SELECT ASSIGN
                                 ,  OpenedCount = sum( iif( OPEN_TIME >=  @StartDate and OPEN_TIME < @EndDate + 1, 1, 0 ) )
                                 ,  ClosedCount  = sum( iif( CLOSE_TIME >=  @StartDate and OPEN_TIME < @EndDate + 1, 1, 0 ) )
                           FROM [dbo].[PROBLEM]
                           GROUP BY ASSIGN
                           ORDER BY ASSIGN

в таблице REQUEST:

SELECT ASSIGNM
                                 ,  OpenedCount = sum( iif( OPEN_TIME >=  @StartDate and OPEN_TIME < @EndDate + 1, 1, 0 ) )
                                 ,  ClosedCount  = sum( iif( CLOSE_TIME >=  @StartDate and OPEN_TIME < @EndDate + 1, 1, 0 ) )
                           FROM [dbo].[REQUEST]
                           GROUP BY ASSIGNM
                           ORDER BY ASSIGNM



Результат должен выглядеть так:

Группа           |         INCIDENTS           |          CHANGE               |        REQUEST               |        PROBLEM               |
                    ----------------------------------------------------------------------------------------------------------------------------
                    |   Открыто   |   Закрыто   |   Открыто   |   Закрыто   |   Открыто   |   Закрыто   |   Открыто   |   Закрыто   |   
--------------------------------------------------------------------------------------------------------------------------------------------
1Группа         |      334       |      76       |      12        |        0        |      334       |      76       |      12        |        0        |
---------------------------------------------------------------------------------------------------------------------------------------------
2Группа         |      23         |      4        |        67      |         9       |      23         |      2        |        45      |         9        |
---------------------------------------------------------------------------------------------------------------------------------------------
3Группа         |      124       |      7        |        44      |          5      |      124        |      111     |        4       |          1       |
----------------------------------------------------------------------------------------------------------------------------------------------


Вчера мне помогли с запросом,где 6 разных таблиц колонку с одинаковым названием,там попроще решается:

SELECT
   t.AFFECTED_ITEM,
   Table1,
   Table2,
   ...
FROM (
SELECT DISTINCT AFFECTED_ITEM FROM Table1
UNION
SELECT DISTINCT AFFECTED_ITEM FROM Table2
UNION
...
) t
LEFT JOIN (select AFFECTED_ITEM, count(AFFECTED_ITEM) as Table1 from Table1 group by AFFECTED_ITEM) as t1 ON t.AFFECTED_ITEM = t1.AFFECTED_ITEM
LEFT JOIN (select AFFECTED_ITEM, count(AFFECTED_ITEM) as Table2 from Table2 group by AFFECTED_ITEM) as t2 ON t.AFFECTED_ITEM = t2.AFFECTED_ITEM
...
ORDER BY t.AFFECTED_ITEM;

Отредактированно Marina_A (18.04.2017 08:02:49)

Неактивен

 

#2 18.04.2017 10:14:11

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5248

Re: Запрос в несколько таблиц,с разным названием столбцов

что-то в стиле:

SELECT
   t.AFFECTED_ITEM,
   Table1,
   Table2,
   ...
FROM (
SELECT DISTINCT ASSIGNMENT FROM Table1
UNION
SELECT DISTINCT ASSIGN_DEPT FROM Table2
UNION
...
) t
LEFT JOIN (select ASSIGNMENT, count(ASSIGNMENT) as Table1 from INCIDENTS group by ASSIGNMENT) as t1 ON t.AFFECTED_ITEM = t1.ASSIGNMENT
LEFT JOIN (select ASSIGN_DEPT, count(ASSIGN_DEPT) as Table2 from CHANGE group by ASSIGN_DEPT) as t2 ON t.AFFECTED_ITEM = t2.ASSIGN_DEPT
...

Неактивен

 

#3 18.04.2017 11:58:57

Marina_A
Участник
Зарегистрирован: 14.03.2017
Сообщений: 19

Re: Запрос в несколько таблиц,с разным названием столбцов

vasya написал:

что-то в стиле:

SELECT
   t.AFFECTED_ITEM,
   Table1,
   Table2,
   ...
FROM (
SELECT DISTINCT ASSIGNMENT FROM Table1
UNION
SELECT DISTINCT ASSIGN_DEPT FROM Table2
UNION
...
) t
LEFT JOIN (select ASSIGNMENT, count(ASSIGNMENT) as Table1 from INCIDENTS group by ASSIGNMENT) as t1 ON t.AFFECTED_ITEM = t1.ASSIGNMENT
LEFT JOIN (select ASSIGN_DEPT, count(ASSIGN_DEPT) as Table2 from CHANGE group by ASSIGN_DEPT) as t2 ON t.AFFECTED_ITEM = t2.ASSIGN_DEPT
...

Сделала по этому принципу


SELECT
   t.AFFECTED_ITEM,
   Table1,
   Table2,
   ...
FROM (
SELECT DISTINCT ASSIGNMENT FROM Table1
UNION
SELECT DISTINCT ASSIGN_DEPT FROM Table2
UNION
...
) t
LEFT JOIN (select ASSIGNMENT,
OpenedCount = sum(iif(OPEN_TIME >= @StartDate and OPEN_TIME < @EndDate + 1, 1,0 )) as Table 1,
ClosedCount = sum(iif(CLOSE_TIME >= @StartDate and OPEN_TIME < @EndDate + 1, 1,0 )) as Table 2
from INCIDENTS group by ASSIGNMENT) as t1 ON t.AFFECTED_ITEM = t1.ASSIGNMENT

LEFT JOIN (select ASSIGN_DEPT,
OpenedCount = sum(iif(OPEN_TIME >= @StartDate and OPEN_TIME < @EndDate + 1, 1,0 )) as Table 1,
ClosedCount = sum(iif(CLOSE_TIME >= @StartDate and OPEN_TIME < @EndDate + 1, 1,0 )) as Table 2
from CHANGE group by ASSIGN_DEPT) as t2 ON t.AFFECTED_ITEM = t2.ASSIGN_DEPT

ORDER BY t.ASSIGN_DEPT


Но тут ошибка выходит

Отредактированно Marina_A (18.04.2017 12:01:52)

Неактивен

 

#4 18.04.2017 12:24:07

klow
Активист
Зарегистрирован: 06.12.2014
Сообщений: 223

Re: Запрос в несколько таблиц,с разным названием столбцов

Но тут ошибка выходит

Вы предлагает нам гадать об ошибке? Обычно таким пользователям я говорю, что все экстрасенсы в отпуске, подождем когда выйдут. smile
Судя по всему, проблема в странной конструкции

OpenedCount = sum(...) as Table 1

Пробуйте так

sum(iif(OPEN_TIME >= @StartDate and OPEN_TIME < @EndDate + 1, 1,0 )) as OpenedCount,
sum(iif(CLOSE_TIME >= @StartDate and OPEN_TIME < @EndDate + 1, 1,0 )) as ClosedCount

Отредактированно klow (18.04.2017 12:26:00)

Неактивен

 

#5 18.04.2017 13:20:34

Marina_A
Участник
Зарегистрирован: 14.03.2017
Сообщений: 19

Re: Запрос в несколько таблиц,с разным названием столбцов

klow написал:

Но тут ошибка выходит

Вы предлагает нам гадать об ошибке? Обычно таким пользователям я говорю, что все экстрасенсы в отпуске, подождем когда выйдут. smile
Судя по всему, проблема в странной конструкции

OpenedCount = sum(...) as Table 1

Пробуйте так

sum(iif(OPEN_TIME >= @StartDate and OPEN_TIME < @EndDate + 1, 1,0 )) as OpenedCount,
sum(iif(CLOSE_TIME >= @StartDate and OPEN_TIME < @EndDate + 1, 1,0 )) as ClosedCount

круто! получилось :-)

Неактивен

 

#6 18.04.2017 13:28:15

klow
Активист
Зарегистрирован: 06.12.2014
Сообщений: 223

Re: Запрос в несколько таблиц,с разным названием столбцов

Это хорошо, но постарайтесь в следующий раз приводить текст самой ошибки. Так будет проще оказать Вам помощь. smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson