2015-06-10 3 views
1

У меня есть таблица в MySQL, как это:MySQL несколько строк в столбцах

Trans Time_In Placard Container Sztp Line Time_Out 
===== ======= ======= ========= ==== ==== ======== 
IN 10:15 254114 CLHU12345 40DH MAE 10:54 <In transaction 
OUT 10:15 254114 MAEU45678 20DR SEA 10:54 <Out Transaction (same placard) 
OUT 10:15 254114 TTNU98765 20DR CHI 10:54 <Out Transaction (same placard) 

IN 11:23 664524 FSCU13479 40RH SEB 11:55 <In transaction 
OUT 11:23 664524 PONU55588 40DR MAB 11:55 <Out Transaction (same placard) 

IN 13:01 542234 TLHU77665 40RH MOL 13:23 <In transaction (no out) 

OUT 13:36 232212 MLHU22341 20DR CMD 13:49 <Out Transaction (no in) 

OUT 14:03 187852 AMFU56041 20DR CMD 14:48 <Out Transaction (no in) 
OUT 14:03 187852 CCLU44112 20DR CHN 14:48 <Out Transaction, same placard (no in) 

Это таблица грузовиков, которые входят в наш терминал уронить контейнер, а иногда, чтобы выбрать один 40" или два 20" (3 транзакции, таким образом, 3 строки). Иногда водитель грузовика просто бросает контейнер и уходит пустой (1 транзакция), поэтому нет транзакции OUT. Или может быть пустым, чтобы выбрать полный контейнер (1 транзакция), поэтому нет транзакции IN, но только один или два OUT (2 транзакции), если он выбирает один 40 или два 20 секунд. Есть даже времена, когда приходит с двумя 20 футами, и листья с 2 20 также, имея 4 транзакции. Время In и Time out одинаково для каждого плаката, поэтому я могу взять его из любой записи, поэтому не стоит беспокоиться об этом.

Ключ Time_In + Placard, поскольку тот же самый плакат может совершать несколько поездок в один и тот же день. Временная метка точно такая же для каждой поездки.

В конце концов, это будет не более 4 транзакций для каждой поездки, и нам нужен отчет по одной строке за поездку, отображающий каждую информацию о транзакции (контейнер, sztp и строку), и если он имеет только один или два, остальные оставшиеся данные транзакции будут пустыми. Для тех, кто не знаком с морскими терминами, sztp означает размер/тип, например 40DR, это 40 футов сухого, 20DR 20 футов сухого, 40RH 40 футовый рефрижераторный куб и т. Д. И т. Д.

Мне нужно закончить с чем-то вроде этого:

Time In Placard Cont1  Sztp1 Line1 Cont2  Sztp2 Line2 Cont3  Sztp3 Line3 Cont4  Sztp4 Line4 Time Out 
======= ======= ========= ===== ===== ========= ===== ===== ========= ===== ===== ========= ===== ===== ======== 
10:15 254114 CLHU12345 40DH MAE MAEU45678 20DR SEA TTNU98765 20DR CHI null  null null 10:54 
11:23 664524 FSCU13479 40RH SEB PONU55588 40DR MAB null  null null null  null null 11:55 
13:01 542234 TLHU77665 40RH MOL null  null null null  null null null  null null 13:23 
13:36 232212 MLHU22341 20DR CMD null  null null null  null null null  null null 13:49 
14:03 187852 AMFU56041 20DR CMD CCLU44112 20DR CHN null  null null null  null null 14:48 

Предполагаемое использование этой таблицы будет для отчета BIRT.

Благодарим за помощь.

Кстати, я уже задал аналогичный вопрос, но с самого начала это было не очень ясно, поэтому я сообщил об этом модератору и разместил его. Извиняюсь за это. Надеюсь, ты поможешь мне.

+0

BIRT вызывает сводные таблицы «кросс-таблицы». FYI. –

+0

Значит, ты имеешь в виду, что я могу сделать с одной только битой? Звучит как сделка. Я буду исследовать это. Оценивается любая точка в правильном направлении. –

+0

Сколько строк будет иметь окончательный отчет? если будет в тысячах или более, я бы сделал тяжелый подъем запроса в SQL с левыми связанными подзапросами. Доминик знает BIRT очень хорошо, так что вы можете пойти с ответом, который у них есть. Я узнал, как сделать решение SQL-запроса на SE, чтобы вы могли найти его здесь, если нет, сообщите мне, и я буду работать, чтобы что-то публиковать. –

ответ

0

Кросстаб BIRT может справиться с этим, например this report находится рядом с тем, что вы хотите сделать: оно переносит 5 строк порядка в столбцы. enter image description here1

Преимущество этого варианта в том, что это полностью динамическая: мы не должны жестко закодировать в любом месте поля каждого номера строки, например CONT1, CONT2, Sztp1, Sztp2 и т.д.

Для достижения то же самое в вашем контексте вам нужен номер строки для каждой транзакции. Такой номер строки может быть вычислен либо в хранимой процедуре MySQL, либо в вычисленном столбце набора данных BIRT, проверяя, что значения «Время» и «Плакат» текущей строки отличаются от предыдущей строки. Конечно, запрос должен заказывать транзакции «Time-In» + «Placard» для этого.

После того, как номер строки доступен в наборе данных мы можем разработать Datacube с 2 группами и 2 мер

  • Первая группа: «Время-В» + «Placard». Добавьте подуровни для отображения этих полей в отдельных столбцах, таких как «Заказ» и «Дата» на скриншоте.
  • Вторая группа: Номер строки
  • Мера 1: поле: "Контейнер" Тип: STRING агрегатная функция: ПЕРВЫЙ
  • Мера 2: поле: "Sztp" Тип: STRING агрегатная функция: ПЕРВЫЙ
+0

Awesome. Я посмотрю на это. Хотя, я предпочитаю делать таблицу со столбцами и сохранять ее в нашем хранилище данных, поэтому отчеты работают быстрее. Любые идеи о том, как я могу вычислить номер строки для каждой транзакции? У меня нет никаких отстающих или ведущих операторов, как в Oracle SQL, с которыми я больше знаком. –

+0

@Martin есть элегантный способ вычисления номера строки в этом разделе: http://stackoverflow.com/questions/17939198/row-number-per-group-in-mysql – Dominique

0

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

Select distinct yourdata.placard 
, yourdata.Time_In 
, yourdata.Time_Out 
, Inbound.Insztp 
, Inbound.InContainer 

from dbo.yourdata 

--Sub query gets inbound sztp and container info 
left join (select placard 
      , sztp as 'Insztp' 
      , Container as 'InContainer' 
      from dbo.yourdata 
      where trans = 'IN') as Inbound 
       on yourdata.placard = Inbound.placard 

Чтобы создать другие столбцы, вам понадобится добавить дополнительные подзапросы, но это основная идея.

Смежные вопросы