Sql 多列上的动态轴心

Sql 多列上的动态轴心,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个表(称为事务),其中包含与事务相关的信息。事务可以有多个注释和附带的详细信息(详细信息不是必需的),但某些事务不会有任何注释。对于针对某笔交易所做的每一条注释,表中会创建一条新记录,其中包含同一笔交易所有记录的某些字段(日期、时间、金额、类型)的相同数据,而记录中的某些字段仅与该特定注释和详细信息相关 见下面的示例数据: +-----------+---------+---------+------+----------------+-----------------+ | Date

我有一个表(称为事务),其中包含与事务相关的信息。事务可以有多个注释和附带的详细信息(详细信息不是必需的),但某些事务不会有任何注释。对于针对某笔交易所做的每一条注释,表中会创建一条新记录,其中包含同一笔交易所有记录的某些字段(日期、时间、金额、类型)的相同数据,而记录中的某些字段仅与该特定注释和详细信息相关

见下面的示例数据:

+-----------+---------+---------+------+----------------+-----------------+ | Date | Time | Amount | Type | Comment | Detail | +-----------+---------+---------+------+----------------+-----------------+ | 13/9/2017 | 9:00AM | $12.10 | Cash | | | +-----------+---------+---------+------+----------------+-----------------+ | 13/9/2017 | 9:30AM | $22.45 | Card | | | +-----------+---------+---------+------+----------------+-----------------+ | 13/9/2017 | 9:30AM | $22.45 | Card | Delivery | deliver to rear | +-----------+---------+---------+------+----------------+-----------------+ | 13/9/2017 | 9:30AM | $22.45 | Card | ReturnCustomer | yes | +-----------+---------+---------+------+----------------+-----------------+ | 13/9/2017 | 9:45AM | $-34.00 | Cash | Refund | | +-----------+---------+---------+------+----------------+-----------------+ | 13/9/2017 | 10:00AM | $17.67 | Card | | | +-----------+---------+---------+------+----------------+-----------------+ | 13/9/2017 | 10:00AM | $17.67 | Card | Deposit | 10% | +-----------+---------+---------+------+----------------+-----------------+ +-----------+---------+---------+------+----------------+-----------------+ |日期|时间|金额|类型|评论|详情| +-----------+---------+---------+------+----------------+-----------------+ |2017年9月13日上午9点12.10美元现金| +-----------+---------+---------+------+----------------+-----------------+ |2017年9月13日|上午9:30 | 22.45美元|卡|| +-----------+---------+---------+------+----------------+-----------------+ |2017年9月13日|上午9:30 | 22.45美元|卡|递送|递送至后方| +-----------+---------+---------+------+----------------+-----------------+ |2017年9月13日上午9:30 | 22.45美元|卡|退货客户|是| +-----------+---------+---------+------+----------------+-----------------+ |2017年9月13日上午9:45 |$-34.00 |现金|退款|| +-----------+---------+---------+------+----------------+-----------------+ |2017年9月13日上午10:00 17.67美元卡片| +-----------+---------+---------+------+----------------+-----------------+ |2017年9月13日|上午10:00 | 17.67美元|卡|存款| 10%| +-----------+---------+---------+------+----------------+-----------------+ 我需要为每个特定事务返回一行,如果对某个事务进行了任何注释/详细信息,则这些注释/详细信息将被旋转到它自己的列中(1表示注释,1表示详细信息)。对于评论超过1条的事务,它们需要是自己的新列和详细信息

所以上面的数据需要像这样返回:

+-----------+---------+---------+------+----------+-----------------+----------------+---------+ | Date | Time | Amount | Type | Comment1 | Detail1 | Comment2 | Detail2 | +-----------+---------+---------+------+----------+-----------------+----------------+---------+ | 13/9/2017 | 9:00AM | $12.10 | Cash | | | | | +-----------+---------+---------+------+----------+-----------------+----------------+---------+ | 13/9/2017 | 9:30AM | $22.45 | Card | Delivery | deliver to rear | ReturnCustomer | yes | +-----------+---------+---------+------+----------+-----------------+----------------+---------+ | 13/9/2017 | 9:45AM | $-34.00 | Cash | Refund | | | | +-----------+---------+---------+------+----------+-----------------+----------------+---------+ | 13/9/2017 | 10:00AM | $17.67 | Card | Deposit | 10% | | | +-----------+---------+---------+------+----------+-----------------+----------------+---------+ +-----------+---------+---------+------+----------+-----------------+----------------+---------+ |日期|时间|金额|类型|注释1 |细节1 |注释2 |细节2| +-----------+---------+---------+------+----------+-----------------+----------------+---------+ |2017年9月13日上午9点12.10美元现金| +-----------+---------+---------+------+----------+-----------------+----------------+---------+ |2017年9月13日|上午9:30 | 22.45美元|卡|送货|送货到后方|退货客户|是| +-----------+---------+---------+------+----------+-----------------+----------------+---------+ |2017年9月13日上午9:45 |$-34.00 |现金|退款| || +-----------+---------+---------+------+----------+-----------------+----------------+---------+ |2017年9月13日上午10:00 | 17.67美元|卡|存款| 10%|| +-----------+---------+---------+------+----------+-----------------+----------------+---------+ 从理论上讲,每笔交易的评论数量没有限制,但事实上,评论数量永远不会超过5条。

这里是另一种方式(用于多栏数据透视)


如果您没有未知的数据集,它可以很容易地转换为动态查询

seach for dynamic pivot我做了,但我不知道如何多次透视两列。
; with CTE as
(
    select *, rn = row_number() over (partition by Date, Time, Amount, Type
                                          order by Date)
    from   yourtable
)
SELECT Date, Time, Amount, Type,
       Comment1 = MAX(CASE WHEN RN = 1 THEN comment END),
       Detail1  = MAX(CASE WHEN RN = 1 THEN detail END),
       Comment2 = MAX(CASE WHEN RN = 2 THEN comment END),
       Detail2  = MAX(CASE WHEN RN = 2 THEN detail END),
       . . . .
FROM   cte
GROUP BY Date, Time, Amount, Type