2016-12-07 4 views

답변

0

테이블을 디자인 한 방식이 제공 한 피벗과 정확히 일치하지는 않습니다. 피벗 테이블 일지라도 열은 동일한 데이터 유형과 일치해야합니다. 텍스트와 숫자를 여러 열의 같은 열에 혼합하는 경우를 예로들 수 있습니다. 이 피벗 테이블과 유사한 보고서를 얻으려면 해당 보고서를 디자인하고 제공하는 데 사용하는보고 도구가 무엇인지 파악해야합니다. SQL 쿼리는 보고서를 작성하기위한 데이터를 선택하지만 완료 상태는 아닙니다. 예를 들어 SSRS를 사용하는 경우 행렬 또는 표 요소를 사용하고 원하는대로 채우도록 필드를 사용자 지정합니다. 하지만 학년과 연도 열을 SQL 쿼리 자체의 문자 등급 열로 혼합 할 수는 없습니다. - 적어도 내가 알고있는 것은 아닙니다.

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; 

DB 코드

도움한다면 당신은이 결과를 얻을 수 있습니다 처음 세 줄을 함께 결합 경우, PIVOT을 사용할 수있는 것보다, 헤더로 처리해야
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 
0

편지의 수

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 ('[email protected]+')) 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 
+0

내가이 것 생각하지 않는다 : 변경 될 수 있습니다, 당신은 샘플입니다 동적 스크립트를 사용한다 OP를 행복하게 만들어서 업 보봇 (upvote)을 할 수는 없지만 SQL을 통해 얻을 수있는 가장 가까운 방법이라고 생각합니다. 그래서 나는 downvote도하지 않을 것입니다. 왜 그가 원하는 것을 얻을 수 없는지에 대해 맨 위에 몇 가지 노트를 추가하면, 나는 이것을 전적으로지지 할 수 있습니다. –