Объединить имена столбцов SQL в виде одной строки [duplicate]

Для этого вам понадобится 0.11 (0.11rc1 отсутствует, окончательная ошибка на следующей неделе)

In [9]: df = DataFrame([ Timestamp('20010101'), Timestamp('20040601') ])

In [10]: df
Out[10]: 
                    0
0 2001-01-01 00:00:00
1 2004-06-01 00:00:00

In [11]: df = DataFrame([ Timestamp('20010101'), 
                          Timestamp('20040601') ],columns=['age'])

In [12]: df
Out[12]: 
                  age
0 2001-01-01 00:00:00
1 2004-06-01 00:00:00

In [13]: df['today'] = Timestamp('20130419')

In [14]: df['diff'] = df['today']-df['age']

In [16]: df['years'] = df['diff'].apply(lambda x: float(x.item().days)/365)

In [17]: df
Out[17]: 
                  age               today                diff      years
0 2001-01-01 00:00:00 2013-04-19 00:00:00 4491 days, 00:00:00  12.304110
1 2004-06-01 00:00:00 2013-04-19 00:00:00 3244 days, 00:00:00   8.887671

Вам нужно, чтобы этот нечетный пример применялся в конце, потому что еще не полная поддержка сканеров timedelta64 [ns] (например, как мы используем Timestamps сейчас для datetime64 [ns], начиная с 0.12)

954
задан DineshDB 26 March 2018 в 08:13
поделиться

9 ответов

Вы можете использовать GROUP_CONCAT :

SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies GROUP BY person_id

Как сказал Людвиг в в своем комментарии, , вы можете добавить оператор DISTINCT в избегайте дубликатов:

SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies GROUP BY person_id

Как указано в в комментарии к , , вы также можете сортировать значения перед их использованием с помощью ORDER BY:

SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
FROM peoples_hobbies GROUP BY person_id

Как сказал Даг в его комментарий, , на результат будет 1024 байта. Чтобы решить эту проблему, запустите этот запрос перед запросом:

SET group_concat_max_len = 2048

Конечно, вы можете изменить 2048 в соответствии с вашими потребностями. Чтобы вычислить и присвоить значение:

SET group_concat_max_len = CAST(
    (SELECT SUM(LENGTH(hobbies)) + COUNT(*) * LENGTH(', ')
    FROM peoples_hobbies GROUP BY person_id)
    AS UNSIGNED
)
1389
ответ дан 11 revs, 8 users 21% 17 August 2018 в 09:45
поделиться
  • 1
    Просто помните об ограничении 1024 байт в результирующем столбце (см. Параметр group_concat_max_len ) – Dag 28 March 2012 в 11:09
  • 2
    И добавив параметр DISTINCT, вы не получите никаких удвоений. ... GROUP_CONCAT(DISTINCT hobbies) – Ludwig 18 June 2012 в 15:39
  • 3
    Мне нужно было получить ВСЕ данные из одного столбца. Не используйте предложение GROUP BY для этого. Пример: SELECT GROUP_CONCAT (электронная почта SEPARATOR ',') FROM пользователей; – Jonathan Bergeron 17 January 2014 в 16:04
  • 4
    Спасибо, я не знал, что существует ограничение длины группы concat. Мне нужно, чтобы обойти список монстров, который я сгенерировал. – pthurmond 25 March 2016 в 15:54
  • 5
    Если вы хотите отсортировать хобби в полученной встраиваемой строке, используйте: SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ') FROM peoples_hobbies GROUP BY person_id – Jan 8 March 2017 в 16:38

Альтернативный синтаксис для конкатенации нескольких отдельных строк

ПРЕДУПРЕЖДЕНИЕ: Эта запись сделает вас голодными.

Я обнаружил, что хочу выбрать несколько отдельных строк вместо группы и конкатенатировать в определенном поле.

Предположим, у вас есть таблица идентификаторов продуктов и их имена и цены:

+------------+--------------------+-------+
| product_id | name               | price |
+------------+--------------------+-------+
|         13 | Double Double      |     5 |
|         14 | Neapolitan Shake   |     2 |
|         15 | Animal Style Fries |     3 |
|         16 | Root Beer          |     2 |
|         17 | Lame T-Shirt       |    15 |
+------------+--------------------+-------+

Затем у вас есть ajax fancy-schmancy, который перечисляет эти щенки как флажки.

Пользователь вашего голодного бегемота выбирает 13, 15, 16. Нет десерта для нее сегодня ...

Найти:

Способ суммирования порядка вашего пользователя в одной строке с чистым mysql.

Решение:

Используйте GROUP_CONCAT с предложением IN :

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary FROM product WHERE product_id IN (13, 15, 16);

Какие выходы:

+------------------------------------------------+
| order_summary                                  |
+------------------------------------------------+
| Double Double + Animal Style Fries + Root Beer |
+------------------------------------------------+

Бонусное решение:

Если вы хотите получить общую цену, перейдите в SUM() :

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary, SUM(price) AS total FROM product WHERE product_id IN (13, 15, 16);
+------------------------------------------------+-------+
| order_summary                                  | total |
+------------------------------------------------+-------+
| Double Double + Animal Style Fries + Root Beer |    10 |
+------------------------------------------------+-------+

PS: Извините, если у вас нет In-N-Out рядом ...

52
ответ дан ahmed hamdy 17 August 2018 в 09:45
поделиться
  • 1
    Несмотря на то, что это хороший ответ, это звучит скорее как реклама, чем просто ответ. Все еще хороший хорошо сформулированный ответ. – FliiFe 15 November 2016 в 18:55

У меня был более сложный запрос, и я обнаружил, что мне пришлось использовать GROUP_CONCAT во внешнем запросе, чтобы заставить его работать:

Исходный запрос:

SELECT DISTINCT userID 
FROM event GROUP BY userID 
HAVING count(distinct(cohort))=2);

Imploded:

SELECT GROUP_CONCAT(sub.userID SEPARATOR ', ') 
FROM (SELECT DISTINCT userID FROM event 
GROUP BY userID HAVING count(distinct(cohort))=2) as sub;

Надеюсь, это может помочь кому-то.

9
ответ дан alexbfree 17 August 2018 в 09:45
поделиться

В моем случае у меня была строка Ids, и ее нужно было передать на char, иначе результат был закодирован в двоичный формат:

SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table
18
ответ дан Fedir RYKHTIK 17 August 2018 в 09:45
поделиться

Вы можете изменить максимальную длину значения GROUP_CONCAT, установив параметр group_concat_max_len.

Подробнее см. в документации по MySQL .

33
ответ дан M Khalid Junaid 17 August 2018 в 09:45
поделиться

Попробуйте следующее:

DECLARE @Hobbies NVARCHAR(200) = ' '

SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;
4
ответ дан Nisse Engström 17 August 2018 в 09:45
поделиться
  • 1
    Это то, что я получил: «Нераспознанный тип оператора. (около «DECLARE» в позиции 0) – Istiaque Ahmed 7 November 2017 в 18:58

Посмотрите на GROUP_CONCAT, если ваша версия MySQL (4.1) поддерживает его. Подробнее см. В документации .

Это будет выглядеть примерно так:

  SELECT GROUP_CONCAT(hobbies SEPARATOR ', ') 
  FROM peoples_hobbies 
  WHERE person_id = 5 
  GROUP BY 'all';
77
ответ дан Paul Mougel 17 August 2018 в 09:45
поделиться
  • 1
    Я думаю, что group by 'all' не является необходимым (к тому же нежелательным), потому что он присваивает всем строкам строку all, а затем сравнивает строки между этими строками. Я прав? – Krzysiek 19 October 2014 в 19:43

Используйте переменную сеанса MySQL (5.6.13) и оператор присваивания, такой как следующий

SELECT @logmsg := CONCAT_ws(',',@logmsg,items) FROM temp_SplitFields a;

, тогда вы можете получить

test1,test11
12
ответ дан Shen liang 17 August 2018 в 09:45
поделиться
  • 1
    это быстрее, чем GROUP_CONCAT? – jave.web 6 February 2014 в 20:39
  • 2
    Я тестировал это под PHPMyAdmin с MySQL server v5.6.17 в столбце description (varchar (50)) в таблице test , но он возвращает поле BLOB для каждой записи: SELECT @logmsg := CONCAT_ws(',',@logmsg,description) from test – Jan 8 March 2017 в 16:31

Функция GROUP Aggregate, GROUP_CONCAT .

23
ответ дан Warren Sergent 17 August 2018 в 09:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: