【问题标题】:SQL Server Query for Many to Many Relationship - how to query?SQL Server 查询多对多关系 - 如何查询?
【发布时间】:2013-02-25 15:16:42
【问题描述】:

这是对我之前问题的更新:Many to many relationship

之前的解决方案效果很好,但现在我想稍微改进一下结果。我想将所有波长值放在一行中。

所以而不是下面的结果:

DateTimeID  Wavelength  SensorID
11435   1581,665    334
11435   1515,166    334
11435   1518,286    335

我想要类似的东西:

DateTimeID  Wavelength1 Wavelength2  SensorID
11435   1581,665    1515,166     334
11435   1518,286                 335

【问题讨论】:

  • 什么 RDMS? SQL Server、Db2、Oracle?和版本?自从上一篇文章标记它以来猜测 SQL Server。
  • 一个波长取决于 SensorID 吗?
  • 您的示例与文本不匹配。该示例有 3 个具有相同 id 的波长分布在 2 行中。
  • 它的 SQL Server 2008 Express 版本。
  • 但是根据我上一篇的关系可以看到,一个SensorID可以关联很多Wavelength。大多数情况下只有 1 个,但在某些情况下是 2 个(sensorID 334)

标签: sql sql-server-2008 many-to-many pivot


【解决方案1】:

您可以使用以下方法将row_number() 应用于记录:

select DateTimeID,
  [1] as Wavelength1, 
  [2] as Wavelength2,
  SensorId
from
(
  select [DateTimeID], [Wavelength], [SensorID],
    row_number() over(partition by DateTimeID, SensorId
                      order by DateTimeID) rn
  from yourtable
) src
pivot
(
  max(Wavelength)
  for rn in ([1], [2])
) piv

SQL Fiddle with Demo

如果您将拥有未知数量的 wavelength 值,那么您可以使用动态 SQL 来生成:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Wavelength'+cast(rn as varchar(50))) 
                    from
                    (
                      select row_number() over(partition by DateTimeID, SensorId
                                              order by DateTimeID) rn
                      from yourtable
                    ) src
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT DateTimeID,' + @cols + ', SensorId  from 
             (
                select [DateTimeID], [Wavelength], [SensorID],
                  ''Wavelength''+cast(row_number() over(partition by DateTimeID, SensorId
                                        order by DateTimeID) as varchar(50)) rn
                from yourtable
            ) x
            pivot 
            (
                max(Wavelength)
                for rn in (' + @cols + ')
            ) p '

execute(@query)

SQL Fiddle with Demo

【讨论】:

  • 谢谢!为什么要使用 max 函数?
  • @patex1987 pivot 需要一个聚合函数。由于wavelength 是一个字符串,那么您将需要使用minmax
  • @patex1987 我添加了一个动态 sql 版本,以防您有未知数量的值需要转换为列。 :)
  • +1 就旋转问题而言,哇,你太棒了! :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
  • 2016-12-15
  • 2017-02-02
  • 1970-01-01
相关资源
最近更新 更多