天道酬勤,学无止境

在 SQL Server 2000 中将一组行转置为列(Transpose a set of rows as columns in SQL Server 2000)

问题

在 SQL Server 中是否有将行转换为列的工具(在 MS-Access 中是可能的)? 我很困惑,因为这个工具在 MS-Access 中可用,但在 SQL Server 中不可用。 SQL Server 中未包含此功能是否是有意设计的?

回答1

http://jdixon.dotnetdevelopersjournal.com/pivot_table_data_in_sql_server_2000_and_2005.htm 上的示例仅在您事先知道行值可以是什么时才有效。 例如,假设您有一个具有自定义属性的实体,并且自定义属性作为子表中的行实现,其中子表基本上是变量/值对,而这些变量/值对是可配置的。

color red
size  big
city  Chicago

我将描述一种有效的技术。 我用过。 我不是在宣传它,但它确实有效。

要在您事先不知道值是什么的地方旋转数据,请动态创建一个没有列的临时表。 然后使用游标循环遍历行,为每个变量发出一个动态构建的“更改表”,以便最终您的临时表具有列、颜色、大小、城市。

然后在临时表中插入一行,通过另一个光标通过变量、值对更新它,然后选择它,通常与其父实体连接,实际上使这些自定义变量/值对看起来像内置的 -在原始父实体的列中。

回答2

所描述的游标方法可能是使用起来最不像 SQL 的方法。 如前所述,SQL 2005 及更高版本的 PIVOT 效果很好。 但是对于旧版本和非 MS SQL 服务器,“Optimzing Transact-SQL”中的 Rozenshtein 方法(编辑:绝版,但有用。来自亚马逊:http://www.amazon.com/Optimizing-Transact-SQL- Advanced-Programming-Techniques/dp/0964981203),非常适合旋转和反旋转数据。 它使用点特征将基于行的数据转换为列。 Rozenshtein 描述了几种情况,这里是一个例子:

SELECT
    RowValueNowAColumn = 
       CONVERT(varchar,
           MAX(
          SUBSTRING(myTable.MyVarCharColumn,1,DATALENGTH(myTable.MyVarCharColumn)
       * CHARINDEX(sa.SearchAttributeName,'MyRowValue'))))
FROM
    myTable

这种方法比使用 case 语句高效得多,并且适用于各种数据类型和 SQL 实现(不仅仅是 MS SQL)。

回答3

最好将这种事情限制在小规模。 如果您使用 SQL 2k 并且没有可用的 PIVOT 功能,我已经起草了一个应该为您完成这项工作的存储过程。 有点拙劣的匆忙工作,所以尽可能多地将其拆开。 将以下内容粘贴到 sql 窗口中,并根据需要编辑底部的 EXEC。 如果您想查看正在生成的内容,请删除中间的 --s:

IF EXISTS (SELECT * FROM SYSOBJECTS WHERE XTYPE = 'P' AND NAME = 'USP_LIST_CONCAT')
DROP PROCEDURE USP_LIST_CONCAT
GO

CREATE PROCEDURE USP_LIST_CONCAT (@SourceTable NVARCHAR(1000) = '' ,@SplitColumn NVARCHAR(1000) = '' , @Deli NVARCHAR(10) = '', @KeyColumns NVARCHAR(2000) = '' , @Condition NVARCHAR(1000) = '')
AS
BEGIN
SET NOCOUNT ON

/* PROCEDURE CREATED 2010 FOR SQL SERVER 2000. SIMON HUGHES. */
/* NOTES: REMOVE --'s BELOW TO LIST GENERATED SQL. */

IF @SourceTable = '' OR @SourceTable = '?' OR @SourceTable = '/?' OR @SplitColumn = '' OR @KeyColumns = ''
BEGIN
PRINT 'Format for use:'
PRINT ' USP_LIST_CONCAT ''SourceTable'', ''SplitColumn'', ''Deli'', ''KeyColumn1,...'', ''Column1 = 12345 AND ...'''
PRINT ''
PRINT 'Description:'
PRINT 'The SourceTable should contain a number of records acting as a list of values.'
PRINT 'The SplitColumn should be the name of the column holding the values wanted.'
PRINT 'The Delimiter may be any single character or string ie ''/'''
PRINT 'The KeyColumn may contain a comma separated list of columns that will be returned before the concatenated list.'
PRINT 'The optional Conditions may be left blank or may include the following as examples:'
PRINT ' ''Column1 = 12334 AND (Column2 = ''ABC'' OR Column3 = ''DEF'')'''
PRINT ''
PRINT 'A standard list in the format:'
PRINT ' Store1, Employee1, Rabbits'
PRINT ' Store1, Employee1, Dogs'
PRINT ' Store1, Employee1, Cats'
PRINT ' Store1, Employee2, Dogs'
PRINT ''
PRINT 'Will be returned as:'
PRINT ' Store1, Employee1, Cats/Dogs/Rabbits'
PRINT ' Store1, Employee2, Dogs'
PRINT ''
PRINT 'A full ORDER BY and DISTINCT is included'
RETURN -1
END


DECLARE @SQLStatement NVARCHAR(4000)

SELECT @SQLStatement = '
DECLARE @DynamicSQLStatement NVARCHAR(4000)

SELECT @DynamicSQLStatement = ''SELECT '+@KeyColumns+', SUBSTRING(''

SELECT @DynamicSQLStatement = @DynamicSQLStatement + '' + '' + CHAR(10) +
'' MAX(CASE WHEN '+@SplitColumn+' = ''''''+RTRIM('+@SplitColumn+')+'''''' THEN '''''+@Deli+'''+RTRIM('+@SplitColumn+')+'''''' ELSE '''''''' END)''
FROM '+ @SourceTable +' ORDER BY '+@SplitColumn+'

SELECT @DynamicSQLStatement = @DynamicSQLStatement + '' ,2,7999) List'' + CHAR(10) + ''FROM '+ @SourceTable+''' + CHAR(10) +'''+CASE WHEN @Condition = '' THEN '/* WHERE */' ELSE 'WHERE '+@Condition END+ '''+ CHAR(10) + ''GROUP BY '+@KeyColumns+'''

SELECT @DynamicSQLStatement = REPLACE(@DynamicSQLStatement,''( +'',''('')

-- SELECT @DynamicSQLStatement -- DEBUG ONLY
EXEC (@DynamicSQLStatement)'

EXEC (@SQLStatement)

END
GO

EXEC USP_LIST_CONCAT 'MyTableName', 'ColumnForListing', 'Delimiter', 'KeyCol1, KeyCol2', 'Column1 = 123456'
回答4

对于 sql server 2005 中的 UNPIVOT,我找到了一篇好文章

sql-server 中的列到行

回答5

我有以下格式的数据

调查_问题_ID

电子邮件(用户

回答

对于 1 项调查,有 13 个问题和答案,我想要的输出是

用户--- Survey_question_ID1 --- Survey_question_ID2

电子邮件---回答---回答........等等

这是SQL Server 2000的解决方案, Cause 字段数据类型为TEXT 。

DROP TABLE #tmp

DECLARE @tmpTable  TABLE
(
emailno NUMERIC,
question1 VARCHAR(80),
question2 VARCHAR(80),
question3 VARCHAR(80),
question4 VARCHAR(80),
question5 VARCHAR(80),
question6 VARCHAR(80),
question7 VARCHAR(80),
question8 VARCHAR(80),
question9 VARCHAR(80),
question10 VARCHAR(80),
question11 VARCHAR(80),
question12 VARCHAR(80),
question13 VARCHAR(8000)
)

DECLARE @tmpTable2  TABLE
(
emailNumber NUMERIC
)

DECLARE @counter INT
DECLARE @Email INT

SELECT @counter =COUNT(DISTINCT ans.email) FROM answers ans WHERE ans.surveyname=100430 AND ans.qnpkey BETWEEN 233702 AND 233714
SELECT * INTO #tmp FROM @tmpTable
INSERT INTO @tmpTable2 (emailNumber) SELECT DISTINCT CAST(ans.email AS NUMERIC) FROM answers ans WHERE ans.surveyname=100430 AND ans.qnpkey BETWEEN 233702 AND 233714

WHILE @counter >0

BEGIN

        SELECT TOP 1 @Email= emailNumber FROM @tmpTable2
        INSERT INTO @tmpTable (emailno) VALUES (@Email )


        Update @tmpTable set question1=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233702 and ans.email=@Email
        Update @tmpTable set question2=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233703 and email=@email
        Update @tmpTable set question3=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233704 and email=@email
        Update @tmpTable set question4=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233705 and email=@email
        Update @tmpTable set question5=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233706 and email=@email
        Update @tmpTable set question6=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233707 and email=@email
        Update @tmpTable set question7=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233708 and email=@email
        Update @tmpTable set question8=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233709 and email=@email
        Update @tmpTable set question9=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233710 and email=@email
        Update @tmpTable set question10=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233711 and email=@email
        Update @tmpTable set question11=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233712 and email=@email
        Update @tmpTable set question12=CAST(answer as VARCHAR(80)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233713 and email=@email
        Update @tmpTable set question13=CAST(answer as VARCHAR(8000)) from answers ans where ans.surveyname=100430 and ans.qnpkey = 233714 and email=@email

        insert into #tmp select * from  @tmpTable       

        DELETE FROM @tmpTable       
        DELETE FROM @tmpTable2 WHERE emailNumber= @Email

        set @counter =@counter -1

End

select * from #tmp
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何在 Pandas 中将行转置为列?(How to transpose rows to columns in Pandas?)
    问题 我正在将 SQL 查询的结果写入 Excel 工作表并尝试将行转换为列,但似乎无法让 Pandas 做出让步; Excel 似乎存在某种难题。 我看过: 如何在熊猫数据框中切换列行 如何在分组后将数据框中的行值转换为 Python 中的列标签? 在 Python Pandas 中将列转换为行 Python Pandas:将行转换为列标题 没有一个似乎工作。 import psycopg2 import pandas as pd import xlsxwriter try: conn = psycopg2.connect(private stuff cannot be shared) except: print ("I am unable to connect to the database") cursor = conn.cursor() writer = pd.ExcelWriter("Z:/AWS/SQLQueries/Phoebe's Request.xlsx",engine = 'xlsxwriter') query20 = """SELECT 2 AS rowtype , source AS "TrafficTypes_Name" , COUNT(source) AS "Traffic" , to_char(week,'MM/dd/yyyy') AS "Week
  • SQL Server:将行转置为列(SQL Server : Transpose rows to columns)
    问题 除了编写游标读取每一行并将其填充到列之外,如果我需要将每一行转置为列,还有其他选择吗? TimeSeconds TagID Value 1378700244 A1 3.75 1378700245 A1 30 1378700304 A1 1.2 1378700305 A2 56 1378700344 A2 11 1378700345 A3 0.53 1378700364 A1 4 1378700365 A1 14.5 1378700384 A1 144 1378700384 A4 10 列数不是固定的。 输出:我只是将n / a分配为占位符,表示该交叉点中没有数据。 TimeSec A1 A2 A3 A4 1378700244 3.75 n/a n/a n/a 1378700245 30 n/a n/a n/a 1378700304 1.2 n/a n/a n/a 1378700305 n/a 56 n/a n/a 1378700344 n/a 11 n/a n/a 1378700345 n/a n/a 0.53 n/a 1378700364 n/a n/a n/a 4 1378700365 14.5 n/a n/a n/a 1378700384 144 n/a n/a 10 希望你能和我分享一些技巧。 谢谢。 回答1 如果预先知道tagID值的一种方法是使用条件聚合
  • 在MySQL中将行转置为列(Transpose rows into columns in MySQL)
    问题 如何在MySQL查询中将行转换为列? 回答1 您可以使用GROUP_CONCAT将行转换为列,但不能以任何自动方式转置整个结果集。 您可以编写一个查询来手动生成每一列,也可以在应用程序中进行查询。 这是有关编写复杂查询以模拟换位的教程: http://www.artfulsoftware.com/infotree/queries.php#78
  • 在BigQuery(数据透视实现)中将行转置为列(Transpose rows into columns in BigQuery (Pivot implementation) [duplicate])
    问题 这个问题已经在这里有了答案: 如何在BigQuery中旋转数据表(6个答案) 9个月前关闭。 我想生成一个新表,并使用BigQuery将所有键值对与键(作为列名)和值(作为其各自的值)一起放置。 例子: **Key** **Value** channel_title Mahendra Guru youtube_id ugEGMG4-MdA channel_id UCiDKcjKocimAO1tV examId 72975611-4a5e-11e5 postId 1189e340-b08f channel_title Ab Live youtube_id 3TNbtTwLY0U channel_id UCODeKM_D6JLf8jJt examId 72975611-4a5e-11e5 postId 0c3e6590-afeb 我想将其转换为: **channel_title youtube_id channel_id examId postId** Mahendra Guru ugEGMG4-MdA UCiDKcjKocimAO1tV 72975611-4a5e-11e5 1189e340-b08f Ab Live 3TNbtTwLY0U UCODeKM_D6JLf8jJt 72975611-4a5e-11e5 0c3e6590-afeb 使用BigQuery怎么做? 回答1
  • SQL将行转置为列(按键变量分组)?(SQL Transpose rows to columns (group by key variable)?)
    问题 我正在尝试将行转置为列,并按唯一标识符(CASE_ID)分组。 我有一个具有这种结构的表: CASE_ID AMOUNT TYPE 100 10 A 100 50 B 100 75 A 200 33 B 200 10 C 我正在尝试查询它以产生这种结构... | CASE_ID | AMOUNT1 | TYPE1 | AMOUNT2 | TYPE2 | AMOUNT3 | TYPE3 | |---------|---------|-------|---------|-------|---------|--------| | 100 | 10 | A | 50 | B | 75 | A | | 200 | 33 | B | 10 | C | (null) | (null) | (假定更大的数据集,其中包含CASE_ID,TYPE和AMOUNT的大量可能值) 我尝试使用数据透视表,但不需要聚合函数(只需尝试重组数据)。 现在,我试图以某种方式使用row_number但不确定如何使用。 我基本上是在尝试复制和调用名为Casestovars的SPSS命令,但需要能够在SQL中执行此操作。 谢谢。 回答1 您可以通过使用row_number()创建一个序列号,然后使用带有CASE表达式的聚合函数来获得结果: select case_id, max(case when seq = 1
  • 根据ID列将行转置为列(Transpose rows to columns based on ID column)
    问题 我当前正在运行SQL Server 2008,并尝试获取以下子查询数据: ID | Field Name | Field Selection 1 | Rating 1 | Good 1 | Rating 2 | Good 1 | Rating 3 | Bad 2 | Rating 1 | OK 根据ID列分组为一行: ID | Rating 1 | Rating 2 | Rating 3 1 | Good | Good | Bad 2 | OK | NULL | NULL 这可能吗? 提前致谢! 欢呼声 回答1 您可以为此使用SQL Server Pivot子句: select p.* from Table1 pivot( max([Field Selection]) for [Field Name] in ([Rating 1], [Rating 2], [Rating 3]) ) as p 或者,您可以手动进行数据透视: select ID, max(case when [Field Name] = 'Rating 1' then [Field Selection] end) as [Rating 1], max(case when [Field Name] = 'Rating 2' then [Field Selection] end) as [Rating 2]
  • 在 SQL Server 中将行转置/旋转到列(Transpose / Pivot Rows to Columns in SQL Server)
    问题 我有三个表 - 第一个包含具有唯一 ID 的问题 QID | Question ------------------ 1 | Question 1 2 | Question 2 3 | Question 3 4 | Question 4 5 | Question 5 第二个包含这些问题的答案,第一个表中的唯一 ID,然后是将答案链接在一起的记录 ID QID | Answer | Parent ------------------------- 1 | Yes | 123 2 | No | 123 3 | No | 123 4 | Yes | 123 5 | Yes | 123 1 | No | 124 2 | Yes | 124 3 | No | 124 4 | No | 124 5 | No | 124 第三个包含有关父级的其他信息 Parent | Parent Title ---------------------------------------- 123 | Questionnaire Sample 1 124 | Questionnaire Sample 2 理想情况下,我想创建一个视图,将数据转置或旋转为更可用的格式,我正在考虑以下方面的内容: Parent | Question 1 | Question 2 | Question 3 | Question
  • 在MYSQL中将行转置为标题(Transpose Rows to Headers in MYSQL)
    问题 我正在尝试转置非常基本的输出以用于Web应用程序。 由于我的优势还在于mysql,因此,我想在它到达应用程序之前就做到这一点。 我目前拥有的是: date value 2012-01-01 23 2012-01-02 33 2012-01-03 56 2012-01-04 10 我想要的是: 2012-01-01 2012-01-02 2012-01-03 2012-01-04 23 33 56 10 我的SQL是: SELECT date, value from values where date >= curdate() - interval 3 day 我已经在网上进行了大量研究,但我找不到解决此问题的好方法。 这将是动态的,因为日期每天都会更改。 回答1 这是一个动态sql,用于透视记录, SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(CASE WHEN date = ''', date, ''' THEN Value ELSE NULL END) AS ', CONCAT('`', date, '`') )) INTO @sql FROM TableName // WHERE date >= curdate() - interval 3 day // add condition here
  • Postgres-将行转置为列(Postgres - Transpose Rows to Columns)
    问题 我有下表,该表为每个用户提供了多个电子邮件地址。 我需要将其展平为用户查询中的列。 请根据创建日期为我提供“最新”的3个电子邮件地址。 user.name | user.id | email1 | email2 | email3** Mary | 123 | mary@gmail.com | mary@yahoo.co.uk | mary@test.com Joe | 345 | joe@gmail.com | [NULL] | [NULL] 回答1 使用来自tablefunc模块的crosstab() 。 SELECT * FROM crosstab( $$SELECT user_id, user_name, rn, email_address FROM ( SELECT u.user_id, u.user_name, e.email_address , row_number() OVER (PARTITION BY u.user_id ORDER BY e.creation_date DESC NULLS LAST) AS rn FROM usr u LEFT JOIN email_tbl e USING (user_id) ) sub WHERE rn < 4 ORDER BY user_id $$ , 'VALUES (1),(2),(3)' ) AS t (user
  • 将行转置为SQL Server 2008 R2中的列(Transpose rows into columns in SQL Server 2008 R2 [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 7年前关闭。 改善这个问题 我该如何转: 和这个: 到这个: 在SQL Server 2008 R2中? 回答1 这个问题与返回值大于1的PIVOT行到列的情况非常相似,您需要在其中将行中的字符串数据聚合到列中。 我将修改该答案,以演示如何将数据转换为最终结果。 由于要聚合字符串值,因此将需要应用min()或max()聚合函数,但是为了使最终结果显示多于一行,您需要强制多行的内容。 为此,您将需要使用row_number()为name每个parameter生成唯一的序列号。 当您应用PIVOT函数时,此数字将在分组中使用,并且您将生成多行: select Car, Truck, Bicycle from ( select vt.name, vp.parameter, row_number() over(partition by vt.name order by vt.id) seq from vehicle_types vt left join vehicle_parameters vp on vt.id = vp.vehicletype ) d pivot ( max(parameter) for name in (Car, Truck
  • 如何将mysql表行转置为列(How to transpose mysql table rows into columns)
    问题 这是我当前的mysql表的样子: PunchID EmpID PunchEvent PunchDateTime 1 0456 clockin 5/14/2013 8:36:26 AM 48 0456 breakout 5/14/2013 12:01:29 PM 53 0456 breakin 5/14/2013 12:28:31 PM 54 0456 clockout 5/14/2013 2:28:33 PM 57 0456 clockin 5/15/2013 7:38:34 AM 58 0456 breakout 5/15/2013 7:38:39 AM 59 0456 breakin 5/15/2013 7:38:41 AM 60 0456 clockout 5/15/2013 7:38:42 AM 现在,我想返回基于星期几进行分组的结果集,如下所示: Day ClockIn BreakOut BreakIn ClockOut Tuesday 8:36:26 AM 12:01:29 PM 12:28:31 PM 2:28:33 PM Wednesday 7:38:34 AM etc, etc... 这是我当前的查询。 但是,它只返回每天的第一个拳头。 SELECT DATE_FORMAT(PunchDateTime, '%W') as day, PunchEvent
  • Excel根据另一列中的值将一些行转置为列(Excel transpose some rows into columns depending on values in another column)
    问题 我有一个Excel文件,看起来像这样: Time 012345 2345678 5647890 7891234 6:00 1 0 0 1 6:30 1 1 0 1 7:00 1 1 0 0 7:30 0 0 0 0 8:00 0 0 1 0 8:30 0 0 1 0 9:00 0 0 1 0 9:30 0 0 1 0 10:00 0 0 0 0 10:30 1 0 0 1 11:00 1 0 0 1 11:30 1 0 0 1 12:00 1 0 0 1 12:30 0 0 0 0 13:00 0 0 0 0 13:30 0 0 1 0 14:00 0 0 1 0 14:30 0 0 1 0 15:00 0 0 1 0 15:30 1 1 0 0 等等。 目的是使它们转置,但采用时间值,而不是列中的实际1和0。 理想的输出如下所示: userID startTime1 stopTime1 startTime2 stopTime2 startTime3 stopTime3 012345 6:00 7:30 10:00 12:30 15:00 2345678 6:00 7:30 15:00 5647890 7:30 10:00 13:00 15:30 7891234 6:00 7:00 10:00 12:30 我尝试设置数据透视表并进行过滤,但这并没有使我感到困惑。
  • 我想在 ms-access 中将行转换为列(I want to transpose rows into columns in ms-access)
    问题 我需要将行转换为 MS Access 数据库、VBA、SQL 中的列,这两种代码都是受欢迎的。 桌子 | Name | Ticker | ID | Innovation | Quality | Year | | XYZ | PQR | 11 | 1 | 1 | 2009 | | XYZ | PQR | 11 | 0 | 1 | 2010 | | XYZ | PQR | 11 | 1 | 0 | 2011 | | XYZ | PQR | 11 | 1 | 1 | 2012 | 所需表 | Year | 2009 | 2010 | 2011 | 2012 | | Name | XYZ | XYZ | XYZ | XYZ | | Ticker | PQR | PQR | PQR | PQR | | ID | 11 | 11 | 11 | 11 | | Innovation | 1 | 0 | 1 | 1 | | Quality | 1 | 1 | 0 | 1 | 从所需的表中可以看出,我试图将 Year 行作为 Column 并将除 Year 之外的所有列列为我的行。 我曾尝试在 MS Access 中使用 Transform 和 Pivot 函数,但它只能旋转一个变量。 让我知道你对此的看法。 以下代码未能转置所有变量。 TRANSFORM Max([Quality])
  • 如何在文件中一次仅将行转置为 7 行的列(How to transpose lines to column for only 7 rows at a time in file)
    问题 请帮忙,我有一个看起来像这样的文本文件: ID: 000001 Name: John Smith Email: jsmith@ibm.com Company: IBM blah1: a blah2: b blah3: c ID: 000002 Name: Jane Doe Email: jdoe@ibm.com Company: IBM blah1: a blah2: b blah3: c ID:000003 . . . etc. 请注意,每个客户的信息都在 7 行中。 ID:000002 标记下一个客户的开始,000003 标记下一个客户,依此类推。 我希望我的输出文件是这样的(而不是下一行中的每个客户的数据,将每个 ID 和随后的 7 行转置为列): ID: 000001,Name: John Smith,Email: jsmith@ibm.com,Company: IBM, blah1: a,blah2: b,blah3: c ID: 000002,Name: Jane Doe,Email: jdoe@ibm.com,Company: IBM,blah1: a,blah2: b,blah3: c 我不确定这是否是最简单的技术,我尝试使用 list 但这似乎不适合我的目的。 我知道我的代码并不优雅,但这只是为了自动化我自己和其他人的一些数据操作。
  • 连接两个表,然后将一个表中的行转置为列名(Join Two Tables Then Transpose Rows From One Table As Column Names)
    问题 我正在尝试加入两个表 ColumnNames ID |Name |Type |Status | ----------------------------------------------------- 1 |Fullname |varchar |Active 2 |Email |varchar |Active 3 |Position |varchar |Active 4 |Category |varchar |Active ColumnValues ID |ColumnNameID |value |Status | ----------------------------------------------------- 1 |1 |Linda |Active 2 |2 |linda@email.com |Active 3 |3 |Soft Eng. |Active 4 |4 |Cat 1 |Active 5 |1 |Remil |Active 6 |2 |Remil@email.com |Active 7 |3 |Senior Soft Eng. |Active 8 |4 |Cat 2 |Active 9 |1 |Ash |Active 10 |2 |ash@email.com |Active 11 |3 |Soft Eng. |Active 12 |4 |Cat 1
  • SQL 将行转置为没有聚合的列(SQL Transpose rows to columns without aggregate)
    问题 我知道有很多答案,但我都没有用。 我的桌子看起来像 我们在给定时间存储仪表打开和关闭状态的地方。 在每个关闭状态之后都有一个打开状态。 我们想像这样转置表格 MeterNo | [power off] | [power on] ____________________________________________________________________ x0039938 | 2016-10-08 14:14:37.610 | 2016-10-08 14:17:15.047 ____________________________________________________________________ x0039938 | 2016-10-08 14:20:50.257 | NULL ____________________________________________________________________ x0039938 | 2016-10-08 14:23:07.610 | 2016-10-08 14:23:17.920 ____________________________________________________________________ x0039940 | 2016-10-08 15:45:38.250 | 2016
  • 在SQL中转置列和行的简单方法?(Simple way to transpose columns and rows in SQL?)
    问题 如何在SQL中简单地切换带有行的列? 有没有简单的命令要转置? 即把这个结果: Paul | John | Tim | Eric Red 1 5 1 3 Green 8 4 3 5 Blue 2 2 9 1 到这个: Red | Green | Blue Paul 1 8 2 John 5 4 2 Tim 1 3 9 Eric 3 5 1 对于这种情况, PIVOT似乎太复杂了。 回答1 您可以通过多种方法来转换此数据。 在您的原始帖子中,您说过PIVOT对于这种情况来说似乎太复杂了,但是可以同时使用SQL Server中的UNPIVOT和PIVOT函数很容易地应用它。 但是,如果您无权访问这些功能,则可以使用UNION ALL复制到UNPIVOT ,然后使用带有CASE语句的聚合函数复制到PIVOT : 创建表: CREATE TABLE yourTable([color] varchar(5), [Paul] int, [John] int, [Tim] int, [Eric] int); INSERT INTO yourTable ([color], [Paul], [John], [Tim], [Eric]) VALUES ('Red', 1, 5, 1, 3), ('Green', 8, 4, 3, 5), ('Blue', 2, 2, 9, 1); 合并所有
  • 将行中的一组值转置为 Access 2010 中的列(Transpose a set of values in rows to columns in Access 2010)
    问题 我有一个看起来像这样的 Access 数据库: ID | TestDate | Test1 | Test2 | Test 3 | 1 | Date1 | 10 | 20 | 25 | 1 | Date2 | 8 | 21 | 23 | 1 | Date3 | 9 | 18 | 23 | 2 | Date1 | 13 | 19 | 22 | 我想将行数据转置为列并保留前一列标题的名称,如下所示: ID = 1 | Date1 | Date2 | Date3 | etc... Test1 | 10 | 8 | 3 | Test2 | 20 | 21 | 18 | Test3 | 25 | 23 | 23 | ID = 2 | Date1 | Test1 | 13 | Test2 | 19 | Test3 | 22 | *The Date1 in the different IDs need not be the same. Date1 is the date the ID had the Test for the first time. 这样可以更容易地监控测试值的趋势。 我试着寻找,但我偶然发现的查询增加了价值。 我只需要转置数据,而不必复制并粘贴到 excel 中。 非常感谢任何 MS Access 查询或 VBA 代码。 谢谢你。 回答1 怎么样: TRANSFORM
  • 将行转置/旋转到列并求和(Transpose/Pivot Rows to Columns and Sum)
    问题 这是我的查询 SELECT * FROM requirementRange PeakRange , DaysOfReq列是 nvarchar 数据类型, Total是 INT 数据类型 表如下 PeakRange DaysOfReq Total 1 - 3.99 >2 Days 2 9.01+ Day 2 3 1 - 3.99 Day 0 1 4 - 5.99 Day 0 1 6 - 8.99 Day 2 2 9 Day 0 1 9.01+ Day 0 1 预期结果 PeakRange Day 0 Day 1 Day 2 >2 Days Total 1 - 3.99 1 0 0 2 3 4 - 5.99 1 0 0 0 1 6 - 8.99 0 0 2 0 2 9 1 0 0 0 1 9.01+ 1 0 3 0 4 在这里,我需要将输出从行转换为列,以及查找总数并将其放置在每个范围的最后一列中。 回答1 您应该能够使用类似于以下内容的内容: select peakrange, coalesce([Day 0], 0) [Day 0], coalesce([Day 1], 0) [Day 1], coalesce([Day 2], 0) [Day 2], coalesce([>2 Days], 0) [>2 Days], peak_Total from ( select
  • MySql换行到列和列到行[重复](MySql Transpose Row into Column and Column into Row [duplicate])
    问题 这个问题已经在这里有了答案: 如何在MySQL中返回数据透视表输出? (9个答案) 7年前关闭。 我在将行移至列和将列移至行时遇到问题。 如果它只是将行转置为列或将列转置为行,则可以这样做。 这是我的数据表 UNIT|JAN|FEB|MAR|APR|MEI|JUN CS-1|100|200|300|400|500|600 CS-2|111|222|333|444|555|666 CS-3|331|123|423|923|918|123 我想得到以下输出 MONTH|CS-1|CS-2|CS-3 JAN |100 |111 |331 FEB |200 |222 |123 MAR |300 |333 |423 等等.. 有人知道该怎么做吗? 非常感谢! 回答1 你可以这样 SELECT month, MAX(CASE WHEN unit = 'CS-1' THEN value END) `CS-1`, MAX(CASE WHEN unit = 'CS-2' THEN value END) `CS-2`, MAX(CASE WHEN unit = 'CS-3' THEN value END) `CS-3` FROM ( SELECT unit, month, CASE month WHEN 'JAN' THEN jan WHEN 'FEB' THEN feb WHEN 'MAR'