答案 0 :(得分:0)
您设计表格的方式并不能完全匹配您提供的支点。即使作为数据透视表,您的列也必须匹配相同的数据类型。您的示例是将文本和数字混合到多个列的同一列中。 如果您希望获得类似于此数据透视表的报告,那么您将使用哪种报告工具来设计并提供该结果。 SQL Query将为您选择数据来构建报告,但它不会是完成状态。 例如,如果您使用的是SSRS,则可以使用矩阵或表格元素,然后自定义字段以填充所需的字段。但是,您无法将等级和年份列混合到SQL查询本身的字母等级列中。 - 至少不是我所知道的。
答案 1 :(得分:0)
Name 2000 2001 2002 2003 2004 2005
aaa 5 10 15 20 25 30
bbb 35 40 45 50 55 60
select *
from
(
select [Name],[Year],[Grade]
from MyGrade
) a
pivot
(
avg([Grade])
for [Year] in ([2000],[2001],[2002],[2003],[2004],[2005])
) piv;
数据库代码
USE [YourDatabase]
GO
/****** Object: Table [dbo].[Grade] Script Date: 8/12/2016 12:40:27 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Grade](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](max) NULL,
[Year] [int] NULL,
[letter] [nvarchar](max) NULL,
[Grade] [int]( NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[Grade] ON
INSERT [dbo].[Grade] ([Id], [Name], [Year], [Grade], [letter]) VALUES (1, N'aaa', 2000, N'5', N'a')
INSERT [dbo].[Grade] ([Id], [Name], [Year], [Grade], [letter]) VALUES (2, N'aaa', 2001, N'10', N'b')
INSERT [dbo].[Grade] ([Id], [Name], [Year], [Grade], [letter]) VALUES (3, N'aaa', 2002, N'15', N'c')
INSERT [dbo].[Grade] ([Id], [Name], [Year], [Grade], [letter]) VALUES (4, N'aaa', 2003, N'20', N'd')
INSERT [dbo].[Grade] ([Id], [Name], [Year], [Grade], [letter]) VALUES (5, N'aaa', 2004, N'25', N'e')
INSERT [dbo].[Grade] ([Id], [Name], [Year], [Grade], [letter]) VALUES (6, N'aaa', 2005, N'30', N'f')
INSERT [dbo].[Grade] ([Id], [Name], [Year], [Grade], [letter]) VALUES (7, N'bbb', 2000, N'35', N'a')
INSERT [dbo].[Grade] ([Id], [Name], [Year], [Grade], [letter]) VALUES (8, N'bbb', 2001, N'40', N'b')
INSERT [dbo].[Grade] ([Id], [Name], [Year], [Grade], [letter]) VALUES (9, N'bbb', 2002, N'45', N'c')
INSERT [dbo].[Grade] ([Id], [Name], [Year], [Grade], [letter]) VALUES (10, N'bbb', 2003, N'50', N'd')
INSERT [dbo].[Grade] ([Id], [Name], [Year], [Grade], [letter]) VALUES (11, N'bbb', 2004, N'55', N'e')
INSERT [dbo].[Grade] ([Id], [Name], [Year], [Grade], [letter]) VALUES (12, N'bbb', 2005, N'60', N'f')
SET IDENTITY_INSERT [dbo].[Grade] OFF
答案 2 :(得分:0)
前三行应该组合在一起并作为标题处理,比你可以使用PIVOT,如果可以改变字母数,你应该使用动态脚本, 这是一个样本:
IF OBJECT_ID('tempdb..#tt') IS NOT NULL DROP TABLE #tt
CREATE TABLE #tt(NAME varchar(5),letter CHAR(1),YEAR int,grade int)
INSERT INTO #tt
SELECT 'aaa','a',2000,5 UNION
SELECT 'aaa','b',2001,10 UNION
SELECT 'aaa','c',2002,15 UNION
SELECT 'aaa','d',2003,20 UNION
SELECT 'aaa','e',2004,25 UNION
SELECT 'aaa','f',2005,30 UNION
SELECT 'bbb','a',2000,10 UNION
SELECT 'bbb','b',2001,20 UNION
SELECT 'bbb','c',2002,30 UNION
SELECT 'bbb','d',2003,40 UNION
SELECT 'bbb','e',2004,50 UNION
SELECT 'bbb','f',2005,60
DECLARE @col VARCHAR(max),@sql VARCHAR(max)
SELECT @col=ISNULL(@col+',[','[')+'letter/'+letter+'/'+LTRIM(year)+']' FROM #tt GROUP BY letter,YEAR
SET @sql='
SELECT * FROM (
SELECT Name,''letter/''+letter+''/''+LTRIM(year) AS letter,grade FROM #tt
) AS t PIVOT(MAX(grade) FOR letter IN ('+@col+')) p'
EXEC(@sql)
Name letter/a/2000 letter/b/2001 letter/c/2002 letter/d/2003 letter/e/2004 letter/f/2005 ----- ------------- ------------- ------------- ------------- ------------- ------------- aaa 5 10 15 20 25 30 bbb 10 20 30 40 50 60