【问题标题】:ACCESS/SQL Combining multiple rows with one column into one row and creating multiple columnsACCESS/SQL 将多行一列合并为一行并创建多列
【发布时间】:2020-06-09 17:33:17
【问题描述】:

我查看了很多示例,但没有什么比我需要的更合适。我有一个表,其中一列中有项目编号,另一列中有图像链接。我遇到的问题是我需要合并具有相同项目编号但需要将 HTML_LINK 列中的数据移动到名为 imagelink1、imagelink2、imagelink3 的多个列。我需要的最大 imagelink 列数是 5。我尝试了一个用于组合行的数据透视表,但它创建了一个包含图像链接名称的列,并且不会将它们移动到 5 个 imagelink 列中的 1 个。

我现在拥有的:

我需要什么:

【问题讨论】:

  • 您好,欢迎来到 Stack Overflow。包含您使用 PIVOT() 方法构造的查询以及它生成的输出可能会很有用,以便我们可以从那里开始工作。我意识到您的查询没有返回预期的结果,但您几乎肯定会想要使用 PIVOT() 方法来完成此操作,因此查看您的尝试会很有用,以便我们评估原因它不工作。

标签: sql ms-access group-by pivot


【解决方案1】:

crosstab 似乎是要遵循的路线,但我无法按照 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

【讨论】:

  • 谢谢!这非常有效。这需要一段时间,但这是一张大桌子,所以这是可以预料的。有没有办法删除字段开头的“intranet5/SWA/DrawingImages”和结尾的“.jpg”?
【解决方案2】:

使用条件聚合:

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 

【讨论】:

    【解决方案3】:

    使用 MS Access'crosstab query 可获得更多动态输出,最多可达 255 列限制。但是,为了使用子查询,您必须在 PIVOT...IN 子句中指定列,这需要对所有可能的列进行硬编码脚本(即最大 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', ...);
    

    【讨论】:

    • @Gustav,经过测试证明,如果您在 PIVOT 子句中指定所有列,则此解决方案确实有效。 OP 只需要提前知道最大列或输入从imagelink1imagelink253 的所有列以获取访问的列限制。使用 Excel 或代码按顺序构建这些字符串。
    • 这不是问题。由于内部查询的字段名称是 t.item 等,它正在吠叫。没有办法解决它。但我相信你,我只是没有时间再次尝试它——这里是休息时间。
    • 对不起,这里没有运气。相同的错误:TRANSFORM 表达式中存在语法错误 - 这是由底层 table.field 名称混淆引起的。这就是 Access 365,也许会有所作为。
    • 这揭示了真正的错误。现在它要求参数t.image_link。那是我放弃的地方。
    • 好吧,我确认它在 Access 2016 中工作,并带有一个接近 OP 数据图像的可重现示例。我什至通过 Excel ADO、Python 和 R 中的 ODBC(MSAccess.exe GUI 外部)进行了检查!带有完整子查询的交叉表通过。是的,如果没有在PIVOT 中列出列,我确实会收到参数错误。但感谢您检查并注意 Office 365 可能的 SQL 引擎更改。
    猜你喜欢
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多