Sql server 按SQL Server(T-SQL)或SSIS中的方式将行转换为列,而不会丢失数据

Sql server 按SQL Server(T-SQL)或SSIS中的方式将行转换为列,而不会丢失数据,sql-server,tsql,ssis,pivot,transpose,Sql Server,Tsql,Ssis,Pivot,Transpose,随附当前和预期的表格数据 当前SQL Server表Src\u Tbl: ID Name Value -------------------------------------------------------------------------- 9C8AA305-5977-4803-8C5F-E0E8665B9069 author Raghav Mishra 9C8AA305-5977-4803-8C5

随附当前和预期的表格数据

当前SQL Server表
Src\u Tbl

ID                                      Name    Value
--------------------------------------------------------------------------
9C8AA305-5977-4803-8C5F-E0E8665B9069    author  Raghav Mishra
9C8AA305-5977-4803-8C5F-E0E8665B9069    title   The First Article to SSC
9C8AA305-5977-4803-8C5F-E0E8665B9069    genre   Fiction
9C8AA305-5977-4803-8C5F-E0E8665B9069    price   200
9C8AA305-5977-4803-8C5F-E0E8665B9069    pub_date    1/31/2013
9C8AA305-5977-4803-8C5F-E0E8665B9069    review  Interesting book
9C8AA305-5977-4803-8C5F-E0E8665B9069    author  Vasanth Mishra
9C8AA305-5977-4803-8C5F-E0E8665B9069    title   The First Article to SSC
9C8AA305-5977-4803-8C5F-E0E8665B9069    genre   Fiction
9C8AA305-5977-4803-8C5F-E0E8665B9069    price   90
9C8AA305-5977-4803-8C5F-E0E8665B9069    pub_date    1/29/2013
9C8AA305-5977-4803-8C5F-E0E8665B9069    review  fiction book
9C8AA305-5977-4803-8C5F-E0E8665B9069    author  Vinoth Mishra
9C8AA305-5977-4803-8C5F-E0E8665B9069    title   The First Article to SSC
9C8AA305-5977-4803-8C5F-E0E8665B9069    genre   Fiction
9C8AA305-5977-4803-8C5F-E0E8665B9069    price   150
9C8AA305-5977-4803-8C5F-E0E8665B9069    pub_date    1/30/2013
9C8AA305-5977-4803-8C5F-E0E8665B9069    review  Good book
转置后,应如下所示:

ID                                      author          title                       genre     price     pub_date    review
-------------------------------------------------------------------------------------------------------------------------------------
9C8AA305-5977-4803-8C5F-E0E8665B9069    Raghav Mishra   The First Article to SSC    Fiction     200     1/31/2013   Interesting book
9C8AA305-5977-4803-8C5F-E0E8665B9069    Vasanth Mishra  The First Article to SSC    Fiction      90     1/29/2013   fiction book
9C8AA305-5977-4803-8C5F-E0E8665B9069    Vinoth Mishra   The First Article to SSC    Fiction     150     1/30/2013   Good book
我试过这个问题

SELECT *
FROM
    (SELECT Name, Value
     FROM dbo.Src_Tbl) AS Src 
PIVOT
    (MAX(Value) FOR Name IN (author, title, genre, price, pub_date, review)) AS PivotTable;
由于
Pivot()
函数强制使用聚合函数,因此它限制了行数(数据丢失)

我只有一张不需要的唱片。我需要直接转置

即使我尝试使用一些case语句,也必须聚合相同问题的分组。这是问题陈述,是来自数据集[简单转置]的客户需求

有没有办法在SSIS/T-SQL/SQL Server中实现这一点

我需要Src_Tbl的结果输出

我必须使用SQL Server进行此操作,T-SQL过程或SSI


另一方面,我真的很惊讶为什么没有像我们在excel中复制粘贴那样进行直接转置的规定。

您可以尝试使用虚构的行号来复制顺序,然后通过添加带有行号()的新列来识别组。Ofc,这不是您存储数据的方式(尝试使用主键,为您的数据提供正确的顺序),但我希望,这将有助于:

WITH Src_Tbl AS (
    SELECT
         t.ID
        ,t.Name
        ,t.Value
    FROM (VALUES
        ('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'author', 'Raghav Mishra')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'title', 'The First Article to SSC')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'genre', 'Fiction')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'price', '200')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'pub_date', '1/31/2013')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'review', 'Interesting book')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'author', 'Vasanth Mishra')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'title', 'The First Article to SSC')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'genre', 'Fiction')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'price', '90')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'pub_date', '1/29/2013')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'review', 'fiction book')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'author', 'Vinoth Mishra')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'title', 'The First Article to SSC')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'genre', 'Fiction')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'price', '150')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'pub_date', '1/30/2013')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'review', 'Good book')

    ) t (ID, Name, Value)
)
SELECT
*
FROM (
    SELECT
         t.ID
        ,t.Name
        ,t.Value
        ,ROW_NUMBER() OVER (PARTITION BY Id, Name ORDER BY t.RN_for_correct_order) AS RN
    FROM (
        SELECT
             t.ID
            ,t.Name
            ,t.Value
            ,ROW_NUMBER() OVER (ORDER BY ISNULL(1, 1)) AS RN_for_correct_order -- try to get same order as in example
        FROM Src_Tbl t
    ) t
) t
PIVOT
    (MAX(Value) FOR Name IN (author, title, genre, price, pub_date, review)) AS PivotTable;

您可以尝试使用虚构的行号重新生成顺序,然后通过添加带有行号()的新列来标识组。Ofc,这不是存储数据的方式(尝试使用主键,为数据提供正确的顺序),但我希望,这将有助于:

WITH Src_Tbl AS (
    SELECT
         t.ID
        ,t.Name
        ,t.Value
    FROM (VALUES
        ('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'author', 'Raghav Mishra')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'title', 'The First Article to SSC')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'genre', 'Fiction')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'price', '200')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'pub_date', '1/31/2013')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'review', 'Interesting book')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'author', 'Vasanth Mishra')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'title', 'The First Article to SSC')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'genre', 'Fiction')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'price', '90')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'pub_date', '1/29/2013')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'review', 'fiction book')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'author', 'Vinoth Mishra')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'title', 'The First Article to SSC')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'genre', 'Fiction')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'price', '150')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'pub_date', '1/30/2013')
        ,('9C8AA305-5977-4803-8C5F-E0E8665B9069', 'review', 'Good book')

    ) t (ID, Name, Value)
)
SELECT
*
FROM (
    SELECT
         t.ID
        ,t.Name
        ,t.Value
        ,ROW_NUMBER() OVER (PARTITION BY Id, Name ORDER BY t.RN_for_correct_order) AS RN
    FROM (
        SELECT
             t.ID
            ,t.Name
            ,t.Value
            ,ROW_NUMBER() OVER (ORDER BY ISNULL(1, 1)) AS RN_for_correct_order -- try to get same order as in example
        FROM Src_Tbl t
    ) t
) t
PIVOT
    (MAX(Value) FOR Name IN (author, title, genre, price, pub_date, review)) AS PivotTable;

SQL表表示无序集。没有排序,因此您无法控制与结果集中的内容匹配的内容,除非您的数据有更多包含该信息的列。如果
Src_Tbl
已在数据库中,则其顺序已丢失。如果它来自外部源,则可以恢复该顺序。如何对其进行排序sing sql?我需要使用tsql创建一个groupid。有什么想法吗?可行吗?基于重复数据模式的分组在这种情况下,作者、标题、流派、价格、发布日期、评论都是重复的数据模式。如何基于此sql表添加groupid列表示无序集。没有排序,因此无法控制匹配的内容在结果集中——除非您的数据有更多包含该信息的列。如果
Src\u Tbl
已经在您的数据库中,那么它的顺序已经丢失。如果它来自外部源,那么您可以恢复该顺序。如何使用sql对其进行排序?我需要使用tsql创建一个groupid。有什么想法吗?可行吗?基于重复数据模式在本例中,作者、标题、流派、价格、发布日期、评论都是重复数据模式。如何在此基础上添加groupid列如果我们对其进行分组,这将起作用。但仍然返回一个结果,因为存在最大值。问题是聚合。正在考虑使用sql进行如下排序,但如何进行?ID名称值groupid 9C8AA305-5977-4803-8C5F-E0E8665B9069作者Raghav Mishra 1 9C8AA305-5977-4803-8C5F-E0E8665B9069 SSC 1 9C8AA305-5977-4803-8C5F-E0E8665B9069类型小说1 9C8AA305-5977-4803-8C5F-E0E8665B9069价格200 1 9C8AA305-5977-4803-8C5F-E0E8665B9069发布日期2013年1月31日1下一组id 2是的,你说得对,只需添加一些识别组就可以了o您的查询,如行号。我已编辑了我的答案,请检查是否正确。现在数据没有丢失,但值映射不正确。作者链接到错误的价格。标题映射不正确的作者…我认为按值排序是造成此问题的原因…是的,正如您问题下的评论中所述,如果您没有聚集索引在您的表中,您可以将数据存储在堆中,但您可以尝试使用类似于“nothing”上的row_number()来重新生成正确的顺序。请使用sql检查我编辑的答案,以获取您的示例。如果我们将其分组,这将起作用。但仍然返回一个结果,因为存在最大值。问题是聚合。正在考虑使用sql进行如下排序,但如何进行?ID名称值组ID 9C8AA305-5977-4803-8C5F-E0E8665B9069作者Raghav Mishra 1 9C8AA305-5977-4803-8C5F-E0E8665B9069标题Fi第一篇文章到SSC 1 9C8AA305-5977-4803-8C5F-E0E8665B9069类型小说1 9C8AA305-5977-4803-8C5F-E0E8665B9069价格200 1 9C8AA305-5977-4803-8C5F-E0E8665B9069发布日期2013年1月31日1下一组id 2是的,你是对的,只需在查询中添加一些组标识,如行号。我编辑了我的答案,请检查是否正确。现在数据是not丢失,但值映射不正确。作者链接到不正确的价格。标题映射不正确的作者…我认为是按值排序造成的…是的,正如您的问题下的评论中已经提到的,如果您的表上没有聚集索引,您可以将数据存储在堆中,但您可以尝试使用h类似于“nothing”上方的行数()。请检查我用sql编辑的答案以获取示例。