Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Разделить данные в запросе / 11 сообщений из 11, страница 1 из 1
22.08.2013, 18:19:12
    #38375176
Tekatoka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разделить данные в запросе
Здравствуйте!

Никак не могу решить поставленную задачу. Имеет ли она вообще решение?

Есть запрос:

Код: sql
1.
2.
3.
4.
SELECT BroadCastSections.BroadCastSectionId, TypedFieldValues.Value, StationFields.MasterName
FROM BroadCastSections 
  INNER JOIN TypedFieldValues ON BroadCastSections.BroadCastSectionId = TypedFieldValues.BroadCastSectionId 
  INNER JOIN StationFields ON TypedFields.StationFieldId = StationFields.StationFieldId



Output - СЕЙЧАС
Код: plaintext
1.
2.
3.
4.
5.
6.
PlanId                     |                Value        | MasterName
1	                   |  2013-08-21 00:00:00.000	 |  End Day/Hour	
1	                   |  2013-08-21 00:00:00.000    |  Start Day/Hour	
2	                   |  2013-08-28 00:00:00.000	 |  End Day/Hour	
2	                   |  2013-08-28 00:00:00.000	 |  Start Day/Hour
3	                   |  2013-08-25 00:00:00.000	 |  End Day/Hour	
3	                   |  2013-08-25 00:00:00.000	 |  Start Day/Hour



Output - НАДО
Код: plaintext
1.
2.
3.
PlanId                     |                Value1       | MasterName_Start           |   Value2                 |  MasterName_End
1	                   |  2013-08-21 01:00:00.000	 |  Start Day/Hour	      | 2013-08-21 02:00:00.000	 |  End Day/Hour	
2	                   |  2013-08-25 05:30:00.000	 |  Start Day/Hour	      | 2013-08-25 07:00:00.000	 |  End Day/Hour	
3	                   |  2013-08-28 10:00:00.000	 |  Start Day/Hour	      | 2013-08-28 12:00:00.000	 |  End Day/Hour

Поясню. У каждого PlanId есть данные "Начало(Start Day/Hour)" и "Конец(End Day/Hour)". Все данные (PlanId, Value, MasterName), как видно из запроса, собираются из разных таблиц.

Надо как-то рассортировать полученные данные по MasterName. Чтобы данные, соответствующие Start Day/Hour, шли в один столбец, а данные, соответствующие End Day/Hour - в другой.

Надеюсь, понятно. Было бы здорово, если бы знатоки что-нить подсказали!
...
Рейтинг: 0 / 0
22.08.2013, 18:21:23
    #38375177
Tekatoka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разделить данные в запросе
(В Output BroadCastSectionId, который в запросе, заменен на PlanId для простоты)
...
Рейтинг: 0 / 0
22.08.2013, 19:15:31
    #38375204
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разделить данные в запросе
Tekatoka,

Код: sql
1.
2.
3.
4.
5.
6.
select 
  PlanId,
  max(if(MasterName='Start Day/Hour',Value,NULL)) time_start,
  max(if(MasterName='End Day/Hour',Value,NULL)) time_end
from tabl
group by PlanId
...
Рейтинг: 0 / 0
22.08.2013, 19:54:58
    #38375237
Tekatoka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разделить данные в запросе
Большое спасибо за ответ!

Приблизительно то, что надо (в моем случае пришлось адаптировать под MSSQL, там это звучит как MAX(CASE WHEN StationFields.MasterName = 'Start Day/Hour' THEN TypedFieldValues.Value1 ELSE NULL END) AS time_start) - сработало!

А можно под это MasterName в условии (CASE) подставлять переменную?

Примерно так: WHEN StationFields.MasterName = @переменная THEN TypedFieldValues.Value1 ELSE NULL END) AS @переменная

Дело в том, что в программе таких полей, как "Start Day" или "End Day", может быть больше (в зависимости от того, что выберет пользователь), и все их надо отдельным столбцом выводить.

Т.е. в идеале - запросить, какие имеются MasterNames, и для каждого из них в отдельном столбце запросить Value.
...
Рейтинг: 0 / 0
22.08.2013, 19:56:24
    #38375238
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разделить данные в запросе
Tekatokaпришлось адаптировать под MSSQLТак у вас какая СУБД? мне топик переносить или нет?
...
Рейтинг: 0 / 0
22.08.2013, 19:57:53
    #38375239
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разделить данные в запросе
Я бы ратовал за использование 2 копий таблицы
...
Рейтинг: 0 / 0
22.08.2013, 19:57:56
    #38375240
Tekatoka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разделить данные в запросе
Ой, да, "слона-то я и не заметил" ))
...
Рейтинг: 0 / 0
22.08.2013, 19:58:34
    #38375241
Tekatoka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разделить данные в запросе
AkinaЯ бы ратовал за использование 2 копий таблицы
А можно подробнее? Спасибо!
...
Рейтинг: 0 / 0
22.08.2013, 21:21:16
    #38375292
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разделить данные в запросе
TekatokaБольшое спасибо за ответ!

Приблизительно то, что надо (в моем случае пришлось адаптировать под MSSQL, там это звучит как MAX(CASE WHEN StationFields.MasterName = 'Start Day/Hour' THEN TypedFieldValues.Value1 ELSE NULL END) AS time_start) - сработало!

А можно под это MasterName в условии (CASE) подставлять переменную?

Примерно так: WHEN StationFields.MasterName = @переменная THEN TypedFieldValues.Value1 ELSE NULL END) AS @переменная

Дело в том, что в программе таких полей, как "Start Day" или "End Day", может быть больше (в зависимости от того, что выберет пользователь), и все их надо отдельным столбцом выводить.

Т.е. в идеале - запросить, какие имеются MasterNames, и для каждого из них в отдельном столбце запросить Value.PIVOT
если значения MasterNames заранее не известны, то еще и динамический SQL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
-- MS SQL
select p.BroadCastSectionId, p.[Start Day/Hour], p.[End Day/Hour] -- или просто *
from(
  SELECT BroadCastSections.BroadCastSectionId, TypedFieldValues.Value, StationFields.MasterName
  FROM BroadCastSections 
  INNER JOIN TypedFieldValues ON BroadCastSections.BroadCastSectionId = TypedFieldValues.BroadCastSectionId 
  INNER JOIN StationFields ON TypedFields.StationFieldId = StationFields.StationFieldId
)s
pivot(max(Value)for MasterName in ([Start Day/Hour],[End Day/Hour]))p -- перечислить все значения MasterName в []
...
Рейтинг: 0 / 0
22.08.2013, 21:22:51
    #38375293
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разделить данные в запросе
а, там надо и MAX, и MIN... Сорь, в PIVOT не получится...
...
Рейтинг: 0 / 0
22.08.2013, 21:50:00
    #38375304
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разделить данные в запросе
TekatokaА можно подробнее?
Схематично:
Код: sql
1.
2.
3.
select t1.id, t1.value, t1.name, t2.value, t2.name
from table t1, table t2
where t1.id=t2.id and t1.name='Start' and t2.name='End

'
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Разделить данные в запросе / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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