SQL Server:如何透视三列表?

时间:2016-12-07 22:51:52

标签: sql sql-server pivot

我有一张这样的表

enter image description here

我希望得到这样的结果,

enter image description here

是否有透视方式?我该怎么办?

3 个答案:

答案 0 :(得分:0)

您设计表格的方式并不能完全匹配您提供的支点。即使作为数据透视表,您的列也必须匹配相同的数据类型。您的示例是将文本和数字混合到多个列的同一列中。 如果您希望获得类似于此数据透视表的报告,那么您将使用哪种报告工具来设计并提供该结果。 SQL Query将为您选择数据来构建报告,但它不会是完成状态。 例如,如果您使用的是SSRS,则可以使用矩阵或表格元素,然后自定义字段以填充所需的字段。但是,您无法将等级和年份列混合到SQL查询本身的字母等级列中。 - 至少不是我所知道的。

答案 1 :(得分:0)

当你正在混合数字和字符串时,npeach是正确的,你想要实现的目标是非常不可能的。即使用当前设计开发SSRS也会令人头疼。但如果能帮到你,你可以得到这个结果

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
相关问题