【问题标题】:Dynamic Pivot of Email Addresses电子邮件地址的动态透视
【发布时间】:2019-07-09 03:14:50
【问题描述】:

我已经尝试对此进行研究,但我无法找到类似的东西。我有一张表,其中可能多次添加和删除条目。我不知道我需要多少列,因此我需要一个动态枢轴。我看到的所有示例都使用 Windows 函数,但我正在旋转电子邮件地址。

表格看起来像这样:

Number | Email
--------------
1      | email1@email.com
1      | email2@email.com
1      | email3@email.com
2      | email4@email.com
2      | email5@email.com
3      | email6@email.com
4      | email7@email.com
4      | email8@email.com

我希望表格看起来像这样(当所有都包括在内时):

Number | Email1           | Email2           | Email3           
---------------------------------------------------------------
1      | email1@email.com | email2@email.com | email3@email.com
2      | email4@email.com | email5@email.com |
3      | email6@email.com |                  |
4      | email7@email.com | email8@email.com |

如果不包括数字 1,它看起来像:

Number | Email1           | Email2                     
--------------------------------------------
2      | email4@email.com | email5@email.com 
3      | email6@email.com |
4      | email7@email.com | email8@email.com

感谢您的帮助!

这是创建模拟表的代码:

CREATE TABLE #table
(number INT, email VARCHAR(30))

INSERT INTO #table (number, email)
VALUES  (1,'email1@email.com')
       ,(1,'email2@email.com')
       ,(1,'email3@email.com')
       ,(2,'email4@email.com')
       ,(2,'email5@email.com')
       ,(3,'email6@email.com')
       ,(4,'email7@email.com')
       ,(4,'email8@email.com')

这与我尝试过的类似,我使用 count 尝试使其工作,但无法。

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += N', p.' + QUOTENAME(Number)
  FROM (SELECT p.Number FROM #table AS p
  GROUP BY p.Name) AS x;

SELECT @columns

SET @sql = N'
SELECT ' + STUFF(@columns, 1, 2, '') + '
FROM
(
  SELECT p.number, p.email
   FROM #test p
) AS j
PIVOT
(
  Count(email) FOR Name IN ('
  + STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')
  + ')
) AS p;';
PRINT @sql;
EXEC sp_executesql @sql;

【问题讨论】:

    标签: sql sql-server sql-server-2008-r2


    【解决方案1】:

    您首先需要通过Number 上的分区创建RNO。 下面的查询应该做你想做的事:

    CREATE TABLE #table (Number INT, Email VARCHAR(30))
    INSERT INTO #table (Number, Email)
    VALUES  (1,'email1@email.com')
           ,(1,'email2@email.com')
           ,(1,'email3@email.com')
           ,(2,'email4@email.com')
           ,(2,'email5@email.com')
           ,(3,'email6@email.com')
           ,(4,'email7@email.com')
           ,(4,'email8@email.com')
    
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Number ORDER BY Number, Email) AS [RNO] INTO #temp FROM #table
    
    DECLARE @DynamicCols NVARCHAR(MAX) = '';
    DECLARE @pvt NVARCHAR(MAX) = '';
    
    SET @pvt = STUFF(
      (SELECT DISTINCT N', ' + QUOTENAME([RNO]) FROM #temp FOR XML PATH('')),1,2,N'')
    
    SET @DynamicCols = STUFF(
      (SELECT DISTINCT N', ' + QUOTENAME([RNO]) + ' AS '+ QUOTENAME('Email' + CAST([RNO] AS VARCHAR(MAX))) FROM #temp FOR XML PATH('')),1,2,N'')
    
    
    EXEC (N'SELECT [Number],'+ @DynamicCols+'
                FROM #temp tmp
            PIVOT (MAX([Email]) FOR RNO IN('+@pvt+')) AS PIV');
    

    【讨论】:

    • 我根据我的需要推断出它,这似乎按预期工作。我必须制作几个临时表并加入它们,因为我必须做一些这些数据透视表并将其加入到具有每个唯一编号的原始数据中。我从来没有做过动态支点,这是完美的。谢谢。
    猜你喜欢
    • 2010-09-19
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    相关资源
    最近更新 更多