【问题标题】:SQL QUERY Pivot and join [duplicate]SQL QUERY Pivot 和 join [重复]
【发布时间】:2015-04-13 11:53:48
【问题描述】:

我有一个名为 data as 的父表

ID     Lat     Lon  

并有一张照片表

ID    id_from_Data_table    photoPath

photo 表中的每条记录都有多条记录。

我想要一个这样的结果集:

lat   lon    photopath1   photopath2   photopath3 ...... 

照片表中每条记录的照片路径列。

【问题讨论】:

  • 这是一个非常常见的问题,并且有很多答案展示了如何进行数据透视。先进行连接,然后是枢轴。
  • 用“动态支点”搜索可以找到很多类似的问题。无论如何,我仍然建议在数据库之外执行此操作,因为它确实不是像这样格式化数据的正确位置
  • 如果你能起草一个样本,我将不胜感激,我花了很多时间,但看起来我对此缺乏一些概念。
  • @Jaan 当然,我已经添加了一个示例。

标签: sql-server select stored-procedures pivot


【解决方案1】:

使用动态 SQL,查询可能如下所示:

DECLARE @cols  AS NVARCHAR(MAX),
        @query AS NVARCHAR(MAX)

SELECT @cols = STUFF((SELECT ',' + QUOTENAME(rn)
                    FROM (
                    SELECT d.*, p.photoPath, rn = CONCAT('Photo Path ',ROW_NUMBER() OVER (PARTITION BY d.id ORDER BY p.id)) 
                    FROM data d 
                    JOIN photo p ON d.ID = p.id_from_Data_table
                ) yourtable
                    GROUP BY rn
                    ORDER BY rn
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SET @query = N'
    SELECT lat, lon, ' + @cols + N' 
    FROM 
    (
       SELECT 
          d.*, 
          p.photoPath, 
          rn = CONCAT(''Photo Path '', ROW_NUMBER() OVER (PARTITION BY d.id ORDER BY p.id)) 
       FROM data d 
       JOIN photo p ON d.ID = p.id_from_Data_table
    ) x
    PIVOT 
    (
       MAX(photoPath) FOR rn IN (' + @cols + N')
    ) p;'

EXEC sp_executesql @query;

Sample SQL Fiddle

【讨论】:

    猜你喜欢
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 2011-12-30
    相关资源
    最近更新 更多