sql语句使列中的行 [英] sql statement to make row in columns

查看:67
本文介绍了sql语句使列中的行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含以下数据的表:

I have a table with the following data:

FIELD1            FIELD2   FIELD3
01/04/2012        A        100
01/04/2012        B        150
02/04/2012        A        100
02/04/2012        B        125
03/04/2012        A        100
04/04/2012        A        130     
04/04/2012        B        160
05/05/2012        B        138
06/05/2012        A        150
06/05/2012        B        160


现在,我想编写一条SQL语句,其中数据应该在像
这样的列中可见


Now I want to write a SQL statement where data should visible in column like

FIELD1            FIELD2   FIELD3    FIELD4       FIELD5
01/04/2012        A        100       B            150
02/04/2012        A        100       B            125    
03/04/2012        A        100
04/04/2012        A        130       B            160
05/05/2012                           B            138
06/05/2012        A        150       B            160


在此先感谢您!


Thanks in advance!

推荐答案

您需要使用PIVOT

SQL-具有总计列和行总数的数据透视 [ ^ ]
You need to use PIVOT

SQL - Pivot with Grand Total Column and Row[^]


正如Mark Mischalke所说:您需要使用数据透视.

示例:
As Mark Mischalke wrote: you need to use a pivot.

Example:
IF NOT  OBJECT_ID(N'#Table1',N'U') IS NULL 
	DROP TABLE #Table1
--create temporary table
CREATE TABLE #Table1 ([FIELD1] DATETIME, [FIELD2] VARCHAR(5), [FIELD3] INT)
--insert data
INSERT INTO #Table1 ([FIELD1] , [FIELD2] , FIELD3 )
	VALUES('01/04/2012','A', 100)
INSERT INTO #Table1 ([FIELD1] , [FIELD2] , FIELD3 )
	VALUES('01/04/2012','B', 150)
INSERT INTO #Table1 ([FIELD1] , [FIELD2] , FIELD3 )
	VALUES('02/04/2012','A', 100)
INSERT INTO #Table1 ([FIELD1] , [FIELD2] , FIELD3 )
	VALUES('02/04/2012','B', 125)
INSERT INTO #Table1 ([FIELD1] , [FIELD2] , FIELD3 )
	VALUES('03/04/2012','A', 100)
INSERT INTO #Table1 ([FIELD1] , [FIELD2] , FIELD3 )
	VALUES('04/04/2012','A', 130)
INSERT INTO #Table1 ([FIELD1] , [FIELD2] , FIELD3 )
	VALUES('04/04/2012','B', 160)
INSERT INTO #Table1 ([FIELD1] , [FIELD2] , FIELD3 )
	VALUES('05/05/2012','B', 138)
INSERT INTO #Table1 ([FIELD1] , [FIELD2] , FIELD3 )
	VALUES('06/05/2012','A', 150)
INSERT INTO #Table1 ([FIELD1] , [FIELD2] , FIELD3 )
	VALUES('06/05/2012','B', 160)
--declare variables
DECLARE @cols1 VARCHAR(200)
DECLARE @dt1 VARCHAR(2000)
DECLARE @pt1 VARCHAR(4000)
--get columns - dynamicly!
SET @cols1 = STUFF((SELECT DISTINCT '],[' + [FIELD2]
					FROM #Table1
					ORDER BY '],[' + [FIELD2]
			FOR XML PATH('')),1,2,'') + ']'
--SELECT @cols1

--get all data 
SET @dt1 = 'SELECT * ' + 
		'FROM #Table1'
--EXEC(@dt1)

--pivot data by A, B, C, ...
SET @pt1 = 'SELECT CONVERT(VARCHAR,PT.[FIELD1],110) AS [FIELD1], ' + @cols1 + ' ' +
		'FROM (' + @dt1 + ') AS DT ' + 
		'PIVOT(MAX([FIELD3]) FOR [FIELD2] IN (' + @cols1 + ')) AS PT' 

EXEC (@pt1)

--delete temporary table
DROP TABLE #Table1



结果:



Result:

[FIELD1]	[A]	[B]
01-04-2012	100	150
02-04-2012	100	125
03-04-2012	100	NULL
04-04-2012	130	160
05-05-2012	NULL	138
06-05-2012	150	160


SELECT DISTINCT rd.Field1,
    (SELECT rd2.FIELD2 FROM RawData rd2 WHERE rd2.Field1 = rd.Field1 and rd2.Field2 = 'A') as Field2, 
    (SELECT rd2.FIELD3 FROM RawData rd3 WHERE rd3.Field1 = rd.Field1 and rd3.Field2 = 'A') as Field3,
    (SELECT rd4.FIELD2 FROM RawData rd4 WHERE rd4.Field1 = rd.Field1 and rd4.Field2 = 'B') as Field4,
    (SELECT rd5.FIELD3 FROM RawData rd5 WHERE rd5.Field1 = rd.Field1 and rd5.Field2 = 'B') as Field5
FROM RawData rd



仅当每个日期表中最多有两个记录时,此方法才有效.

问候,

曼弗雷德(Manfred)



This will only work if there are at most two records in your table for each date.

Regards,

Manfred


这篇关于sql语句使列中的行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆