Sql server 按SQL Server(T-SQL)或SSIS中的方式将行转换为列,而不会丢失数据
随附当前和预期的表格数据 当前SQL Server表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
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编辑的答案以获取示例。