【问题标题】:Pivoting string fields in SQL Server 2008 R2在 SQL Server 2008 R2 中透视字符串字段
【发布时间】:2015-04-29 17:19:52
【问题描述】:

我需要根据一系列 SQL 子查询生成的数据集创建一个数据集。可以使用以下代码复制子查询的结果:

CREATE TABLE Table1
    (`StayID` varchar(3), `IncidentOrder` int, `TxDetails` varchar(73))
;

INSERT INTO Table1
    (`StayID`, `IncidentOrder`, `TxDetails`)
VALUES
    ('IP1', 1, 'Ward: A9999 - 01/01/2015 - 15:23'),
    ('IP1', 2, 'Consultant: Joe Bloggs Specialty :GERIATRIC MEDICINE - 02/01/2015 - 08:17'),
    ('IP1', 3, 'Discharge - 06/02/2015 - 16:40'),
    ('IP2', 1, 'Consultant: Joe Bloggs - 01/01/2015 - 09:02'),
    ('IP2', 2, 'Consultant: Joe Bloggs Specialty :GERIATRIC MEDICINE - 02/01/2015 - 12:56'),
    ('IP2', 3, 'Ward: A9999 - 02/01/2015 - 19:39'),
    ('IP2', 4, 'Consultant: Joe Bloggs - 05/01/2015 - 08:22'),
    ('IP3', 1, 'Ward: A9999 - 02/01/2015 - 04:58'),
    ('IP3', 2, 'Consultant: Joe Bloggs Specialty :GASTROENTEROLOGY - 02/01/2015 - 07:27'),
    ('IP3', 3, 'Consultant: Joe Bloggs - 05/01/2015 - 09:06'),
    ('IP3', 4, 'Ward: A9999 Consultant: Joe Bloggs - 05/01/2015 - 16:45'),
    ('IP3', 5, 'Ward: A9999 Consultant: Joe Bloggs - 05/01/2015 - 17:10'),
    ('IP3', 6, 'Ward: A9999 - 05/01/2015 - 18:14')
;

我需要产生如下结果:

列:StayID、Tx1、Tx2、Tx3、Tx.、Txn

为每个匹配的 StayID 和 Txn 列填充 TransferDetails(基于 IncidentOrder)。

IncidentOrder 不是固定的,对于数据集中的每个 StayID,它可能是 10、30 或 1,因此静态数据透视不是一个选项。

我已经尝试(但失败了)使用 PIVOT 生成所需的输出,希望这里有人可以提供帮助。

提前致谢

【问题讨论】:

  • 请添加预期输出

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


【解决方案1】:

检查这个动态查询,

DECLARE @ColName VARCHAR(MAX),
        @qry VARCHAR(MAX)

SELECT @ColName = ISNULL(@ColName + ',','') + QUOTENAME(IncidentOrder)
FROM (SELECT DISTINCT IncidentOrder FROM Table1) AS cols

SET @qry = 'SELECT StayID, ' + @ColName + ' FROM
            (
                SELECT StayID, IncidentOrder, TxDetails
                FROM   Table1
            ) AS Tbl
            PIVOT
            (
                MAX(TxDetails) FOR IncidentOrder
                IN (' + @ColName + ')
            )
            AS pvt'

EXEC(@qry)

在这里查看小提琴Fiddle

【讨论】:

    【解决方案2】:

    你有无数的事件吗? 您是否希望您的透视数据仅包含实际存在的事件的列?

    如果您对这两个问题的回答都是否定的,我认为以下查询可能会对您有所帮助。

    SELECT 
    STAYID,
    DECODE(INCIDENTORDER,'1',TxDetails,NULL) AS Tx1,
    DECODE(INCIDENTORDER,'2',TxDetails,NULL) AS Tx2,
    DECODE(INCIDENTORDER,'3',TxDetails,NULL) AS Tx3,
    .
    .
    DECODE(INCIDENTORDER,'n',TxDetails,NULL) AS Txn
    FROM Table1
    GROUP BY
    STAYID;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      相关资源
      最近更新 更多