ДОСТУП / SQL Объединение нескольких строк с одним столбцом в одну строку и создание нескольких столбцов - PullRequest
1 голос
/ 26 февраля 2020

Я посмотрел довольно много примеров, и ничто не подходит так, как мне нужно. У меня есть таблица с номерами элементов в одном столбце и ссылками на изображения в другом столбце. У меня проблема в том, что мне нужно объединить строки, которые имеют одинаковый номер элемента, но нужно переместить данные в столбце HTML_LINK в несколько столбцов, называемых imagelink1, imagelink2, imagelink3. Максимальное количество столбцов imagelink, которое мне понадобится, составляет 5. Я попробовал сводную таблицу, которая работала для объединения строк, но она создает столбец с именем ссылки на изображение и не перемещает их в 1 из 5 столбцов imagelink.

Что у меня сейчас:

current table

что мне нужно:

table I need

Ответы [ 3 ]

1 голос
/ 26 февраля 2020

С MS Access ' запрос кросс-таблицы для получения дополнительных динамических данных c до предела в 255 столбцов. Однако, чтобы использовать подзапросы, вы должны указать столбцы в предложении PIVOT...IN, которое требует жесткого написания кода всех возможных столбцов (т. Е. Max COUNT):

TRANSFORM MAX(html_link) AS SumOfPrice
SELECT sub.item, COUNT(*) AS [Total]
FROM 
  (select t.item, t.image_link, 
        (select count(*) from mytable
         where item = t.item 
           and html_link <= t.html_link) + 1 as col
   from mytable as t) sub    
GROUP BY sub.item
PIVOT 'imagelink' & col IN ('imagelink1', 'imagelink2', 'imagelink3', ...);
1 голос
/ 26 февраля 2020

A кросс-таблица кажется, что путь должен следовать, но я не мог заставить подзапрос работать, как предложено Parfait - пришлось использовать DCount :

TRANSFORM 
    First(q1.[html_link]) AS html_link
SELECT 
    [item]
FROM 

    (SELECT 
        item, 
        html_link, 
        DCount("*", "mytable", "item = '" & item & "' and html_link <= '" & html_link & "'") AS Index
    FROM 
        mytable) AS q1  

GROUP BY 
    [item] 
PIVOT 
    "ImageLink" & q1.[index];

«Очистить» ссылку:

Left(Mid([html_link], InStrRev([html_link], "/") + 1), InStr(Mid([html_link], InStrRev([html_link], "/") + 1), ".") - 1) As Link
1 голос
/ 26 февраля 2020

С условной агрегацией:

select item,
  max(iif(col = 1, html_link, null)) as imagelink1,
  max(iif(col = 2, html_link, null)) as imagelink2,
  max(iif(col = 3, html_link, null)) as imagelink3,
  max(iif(col = 4, html_link, null)) as imagelink4,
  max(iif(col = 5, html_link, null)) as imagelink5
from (
  select t.*, 
    (select count(*) from tablename where item = t.item and html_link <= t.html_link) as col
  from tablename as t
)
group by item 
...