Как мне преобразовать эту таблицу из строки в столбец? - PullRequest
0 голосов
/ 01 июля 2019

У меня есть таблица, содержащая идентификатор и название страны, и мне нужно преобразовать их, чтобы идентификатор с более чем одной страной отображался в 1 строке. Я искал в этом форуме более часа и ничего не нашел.

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

Это мини-версия стола, который у меня есть. Число различных значений в поле «страна» будет больше 100, поэтому я могу просто сказать что-то вроде когда county = '..', так как это будет повторяться.

enter code here
 +----+--------+
| id | country|
+----+--------+
| 1  | US     |
| 1  | UK     |
| 2  | JP     |
+----+--------+

Желаемый результат Я ищу:

enter code here

+----+-----------+-----------+
| id | country_1 | country_2 |
+----+-----------+-----------+
| 1  | US        |   UK      |
| 2  | JP        |   null    |
+----+-----------+-----------+

Я нашел этот вопрос похожим, но он противоположен тому, чего я пытаюсь достичь.

Оператор MySQL для сводной таблицы без использования сводной функции или объединения


+++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++ Обновление:

Большое спасибо за вашу помощь. Возможно, я не использовал ваши запросы, чтобы решить мою проблему - из-за того, что синтаксис немного отличается в снежинке. Тем не менее, я получил понимание от всех вас.

вот мое решение:

enter code here
select t1.id,
max(iff(t1.row_number = 1, t1.country ,null)) as country_1,
max(iff(t1.row_number = 2, t1.country ,null)) as country_2,
max(iff(t1.row_number = 3, t1.country, null)) as country_3
from
(
  select id, country, row_number() over (partition by id order by id ) as 
row_number
  from table
) t1
group by t1.id

Ответы [ 5 ]

3 голосов
/ 01 июля 2019

В то время как вы могли бы сделать это с помощью «поворота», что произойдет, когда у вас будет 3 страны?Или 4?Или 17?

Могу ли я предложить это:

SELECT id,
       GROUP_CONCAT(country)
    FROM tbl
    GROUP BY id;

Вы получите что-то вроде:

1   US,UK
2   JP
2 голосов
/ 01 июля 2019

использовать агрегацию

 select id, max(case when id=1 then country end ) as country_1,
 max(case when id=2 then country end ) as country_2
 from tbale group by id
1 голос
/ 01 июля 2019

Вы можете попробовать следующий скрипт с RowNumber, сгенерированным для каждого идентификатора. Поскольку вы подтвердили, что максимум 3 страны на один идентификатор, мы можем легко сгенерировать желаемый набор результатов, обработав RowNumber 1,2 & 3

SELECT ID,
MAX(CASE WHEN RowNumber = 1 THEN country ELSE NULL END) Country_1,
MAX(CASE WHEN RowNumber = 2 THEN country ELSE NULL END) Country_2,
MAX(CASE WHEN RowNumber = 3 THEN country ELSE NULL END) Country_3
FROM
(
    SELECT id, 
    country,
    @row_num :=IF(@prev_value = concat_ws('',id),@row_num+1,1)AS RowNumber
    ,@prev_value := concat_ws('',id)
    FROM tbale
    ORDER BY id
)A 
GROUP BY id
1 голос
/ 01 июля 2019

Когда вы комментируете ответ @Rick, у вас есть максимум 3 страны для каждого идентификатора, тогда вы можете использовать это

select 
id,
(select country from test  where test.id=t.id limit 0,1)as country_1,
(select country from test where test.id=t.id limit 1,1)as country_2,
(select country from test where test.id=t.id limit 2,1)as country_3
from test as t
group by id;

DEMO

1 голос
/ 01 июля 2019

В SQL нет "динамического" PIVOT.Вам нужно указать список столбцов при написании запроса.Возможны следующие варианты:

  1. Если вы заранее знаете количество столбцов, то решение @ZaynulAbadinTuhin будет проще.Кажется, однако, что это не ваш случай.

  2. Если вы не знаете заранее количество столбцов и хотите, чтобы они были объединены в один столбец, тогда @Rick Jamesрешение является лучшим.

  3. В противном случае вы все равно можете использовать какой-то динамический SQL в своем приложении или в хранимой процедуре, которая будет строить запрос SQL во время выполнения на основе существующих значений.стола.Но это решение потребует гораздо большего программирования.Это больше не единственный SQL-запрос.См. Поворот Рика Джеймса в хранимой процедуре MySQL .

...