sql-server - 如何在一行中显示所有组合?

标签 sql-server t-sql sql-server-2008-r2

我试图在这里找到类似的问题,但找不到。这是我的问题的一个非常简化的版本。我有这张表A A

我还有另一张 table : B

我想显示这样的结果: enter image description here

此处(最后一个结果集中)的列数将根据每个 ID 的组合数量而有所不同。这可能吗?我对 sql hub 的了解有限,但不确定这实际上是一个数据透视表。欢迎任何想法。

最佳答案

您是对的,使用 Pivot 您可以将行转置为列。

CREATE TABLE #TableA
  (ID   INT,NAME VARCHAR(100))

INSERT INTO #TableA
VALUES     (1000,'Anna'),(2000,'Peter')

CREATE TABLE #TableB
  (ID    INT,City  VARCHAR(50),dates VARCHAR(50))

INSERT INTO #TableB
VALUES      (1000,'New york','2014-05-10' ),(1000,'Atlanta','2014-06-11'),
            (1000,'Los ang','2014-09-11'),(2000,'seattle','2014-02-10'),
            (2000,'miami','2014-03-11') 

SELECT id,
       Max([city1])  [City],
       Max([dates1]) [Dates],
       Max([city2])  [City],
       Max([dates2]) [Dates],
       Max([city3])  [City],
       Max([dates3]) [Dates]
FROM   (SELECT 'city'+ CONVERT(VARCHAR(50), Row_number() OVER(partition BY B.id ORDER BY dates)) cityrn,
               'dates'+ CONVERT(VARCHAR(50), Row_number() OVER(partition BY B.id ORDER BY dates)) datesrn,
               A.id,A.NAME,B.City,B.dates
        FROM   #TableB B
               JOIN #TableA a
                 ON A.id = B.ID) a 
               PIVOT (Max(City)
                    FOR cityrn IN([city1],[city2],[city3])) piv
               PIVOT (Max(dates)
                    FOR datesrn IN ([dates1],[dates2],[dates3])) piv1
        GROUP BY id

动态版本:

DECLARE @citycols  VARCHAR(max)='',
        @datsecols VARCHAR(max)='',
        @aggcitycols  VARCHAR(max)='',
        @aggdatsecols VARCHAR(max)=''
DECLARE @sql          NVARCHAR(max)

SELECT @citycols += ',[' + crn + ']'
FROM  (SELECT DISTINCT 'city'+ CONVERT(VARCHAR(50), Row_number() OVER(partition BY id ORDER BY dates)) crn
       FROM   #TableB) a

SELECT @datsecols += ',[' + drn + ']'
FROM   (SELECT DISTINCT 'dates'+ CONVERT(VARCHAR(50), Row_number() OVER(partition BY id ORDER BY dates)) drn
        FROM   #TableB) a

SELECT @citycols = RIGHT(@citycols, Len(@citycols) - 1)
SELECT @datsecols = RIGHT(@datsecols, Len(@datsecols) - 1)

SELECT @aggcitycols += ',' + crn
FROM  (SELECT DISTINCT 'max(city'+ CONVERT(VARCHAR(50), Row_number() OVER(partition BY id ORDER BY dates))+ ') City' crn
       FROM   #TableB) a

SELECT @aggdatsecols += ',' + drn
FROM   (SELECT DISTINCT 'max(dates'+ CONVERT(VARCHAR(50), Row_number() OVER(partition BY id ORDER BY dates))+ ') [Date]' drn
        FROM   #TableB) a

SELECT @aggcitycols = RIGHT(@aggcitycols, Len(@aggcitycols) - 1)
SELECT @aggdatsecols = RIGHT(@aggdatsecols, Len(@aggdatsecols) - 1) 



SET @sql='  SELECT id,' + @aggcitycols + ',' + @aggdatsecols+ '
                 FROM   (SELECT ''city''+ CONVERT(VARCHAR(50), Row_number() OVER(partition BY B.id ORDER BY dates)) cityrn,
                                ''dates''+ CONVERT(VARCHAR(50), Row_number() OVER(partition BY B.id ORDER BY dates)) datesrn
                                ,A.id,A.name,B.City,B.dates
                         FROM   #TableB b join #TableA a ON A.id = B.ID) a
                            PIVOT (Max(City)
                                 FOR cityrn IN(' + @citycols+ ')) piv
                            PIVOT (Max(dates)
                                 FOR datesrn IN (' + @datsecols+ ')) piv1
                         GROUP BY id
             '

EXEC Sp_executesql @sql 

输出

   +-----+--------+-----------+------------+---------+-----------+----------+-------------+
   | ID  |  NAME  | City      | Date       | City    |  Date     |  City    |   Date      |
   +-----+--------+-----------+------------+---------+-----------+----------+-------------+ 
   |1000 |  Anna  | New york  | 2014-05-10 | Atlanta | 2014-06-11|  Los ang |  2014-09-11 |
   +-----+--------+-----------+------------+---------+-----------+----------+-------------+ 
   |2000 |  Peter | seattle   | 2014-02-10 | miami   | 2014-03-11|  NULL    |   NULL      |
   +-----+--------+-----------+------------+---------+-----------+----------+-------------+

关于sql-server - 如何在一行中显示所有组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26830949/

相关文章:

sql - 随着时间的推移删除重复项

sql - 使用枢轴时的动态类型转换

sql - 在SQL中选择100个最低值?

sql-server - SQL 查询 - COUNT 用于单个表中两列或更多列的组合

sql - Microsoft SQL Server API运行SQL查询以将数据导出到自定义目标

sql - 使用 SQL Server 中的先前日期填充缺失的日期

sql - 为什么我的一年中的一周查询显示 "2022.52",而它应该显示 "2021.52"

sql - 从表中多次选择记录

C# INSERT 与 INSTEAD OF INSERT 触发器

sql-server - 每个数据库映射到不同的链接服务器