2012-02-29 3 views
1

私は表示水平行縦にSQL Server 2005の

SELECT EMPID,ENAME,SALARY,DEPARTMENT from EMPLOYEE 

のようなSELECT文を発行すると、データが

EMPID  ENAME SALARY DEPARTMENT 
--------------------------------------------- 
01  TEST1 2000  A/C 
02  TEST2 3000  SALES 

のように示したが、今私はそう

EMPID  01  02 

ENAME  TEST1 TEST2 

SALARY  2000 3000 

DEPARTMENT A/C  SALES 

のようにそれを表示したいです上記のクエリのためにSQLを書く方法。

+1

をドロップしますあなたは200の雇用を持っているときに201の列が必要になることを認識しています、なぜそれが必要でしょうか? – Lamak

+0

これらの結果はどこに表示されますか? – kaj

答えて

1

このような何か:

まずいくつかのテストデータ:

CREATE TABLE tblTempValues 
    (
     EMPID VARCHAR(100), 
     ENAME VARCHAR(100), 
     SALARY INT, 
     DEPARTMENT VARCHAR(100) 
    ) 

INSERT INTO tblTempValues 
VALUES 
    ('01','TEST1',2000,'A/C'), 
    ('02','TEST2',3000,'SALES') 

PIVOTに列を取得します。このようなダイナミックなピボットを行うその後

DECLARE @cols VARCHAR(MAX) 
;WITH CTE 
AS 
(
    SELECT 
     ROW_NUMBER() OVER(ORDER BY tblTempValues.EMPID) AS RowNbr 
    FROM 
     tblTempValues 
) 
SELECT 
    @cols=COALESCE(@cols +','+QUOTENAME(RowNbr),QUOTENAME(RowNbr)) 
FROM 
    CTE 

:私はEMPIDROW_NUMBERを使用しています。 orderWeightあなたが列の順序を持​​つことになりますように:

DECLARE @query NVARCHAR(4000)= 
N';WITH CTE 
AS 
(
    SELECT ''EMPID'' AS ID, CAST(EMPID AS VARCHAR(MAX)) AS Value, ROW_NUMBER() OVER(ORDER BY EMPID) AS RowId,1 as orderWeight FROM tblTempValues UNION ALL 
    SELECT ''ENAME'' AS ID, CAST(ENAME AS VARCHAR(MAX)) AS Value, ROW_NUMBER() OVER(ORDER BY EMPID) AS RowId,2 as orderWeight FROM tblTempValues UNION ALL 
    SELECT ''SALARY'' AS ID, CAST(SALARY AS VARCHAR(MAX)) AS Value, ROW_NUMBER() OVER(ORDER BY EMPID) AS RowId,3 as orderWeight FROM tblTempValues UNION ALL 
    SELECT ''DEPARTMENT'' AS ID, CAST(DEPARTMENT AS VARCHAR(MAX)) AS Value, ROW_NUMBER() OVER(ORDER BY EMPID) AS RowId,4 as orderWeight FROM tblTempValues 
) 
SELECT 
    ID,'[email protected]+' 
FROM 
    CTE 
PIVOT 
(
    MAX(Value) 
    FOR RowId IN('[email protected]+') 

) AS p' 

EXECUTE(@query) 

その後、私の場合、私はあなたが?そのテーブルの上に得ることを期待するにはどうすればよい多くの行一時テーブル

DROP TABLE tblTempValues 
+0

+1 - 私の答えよりもはるかに優れています。 – HeavenCore

+0

ありがとうございました。あなたの答えは同様に機能します。しかし、効果的ではないかもしれません。神は試して.. – Arion

0

最初にオフにすると、「列への行」の質問が常に表示され、通常はPIVOT()をおすすめしますが、この場合はさまざまな数の列があります新しい従業員を作成するとき。だから私はPIVOT()をどのように使うことができるか見ていない。私が考えることができる唯一のアプローチは、clunky反復ベースのSQLに頼ることです。

この回答は私のよりよい判断に反するものであり、多数の従業員を抱えている場合は非常に悪い結果となります(私はこれを十分に強調することはできません!)しかし、ピーク時、シナリオによっては十分です。

--#### Create Dummy Data 
CREATE TABLE [dbo].[tbl_ExampleData](
    [EMPID] [varchar](2) NULL, 
    [ENAME] [varchar](50) NULL, 
    [SALARY] [decimal](18, 0) NULL, 
    [DEPARTMENT] [varchar](50) NULL 
) ON [PRIMARY] 

GO 
SET ANSI_PADDING OFF 
GO 
INSERT [dbo].[tbl_ExampleData] ([EMPID], [ENAME], [SALARY], [DEPARTMENT]) VALUES (N'01', N'TEST1', CAST(2000 AS Decimal(18, 0)), N'A/C') 
GO 
INSERT [dbo].[tbl_ExampleData] ([EMPID], [ENAME], [SALARY], [DEPARTMENT]) VALUES (N'02', N'TEST2', CAST(3000 AS Decimal(18, 0)), N'SALES') 
GO 

--#### Select data as columns 
DECLARE @CrossTabCursor CURSOR 
DECLARE @CursorVal_EmpID VARCHAR(4) 

-- #### Create the Basic Temp Table that we will build the crosstab data in 
CREATE TABLE #tbl_CrossTabExample ([-] VARCHAR(50)) 

-- #### Populate the Y axis 
INSERT INTO #tbl_CrossTabExample 
     ([-] 

     ) 
     SELECT 'EMPID' 
     UNION ALL 
     SELECT 'ENAME' 
     UNION ALL 
     SELECT 'SALARY' 
     UNION ALL 
     SELECT 'DEPARTMENT' 


-- #### Add the nessasary columns - in this case, a varchar column per employee 
SET 
@CrossTabCursor = CURSOR FAST_FORWARD FOR 
SELECT [EMPID] FROM [dbo].[tbl_ExampleData] 
OPEN @CrossTabCursor 
FETCH NEXT FROM @CrossTabCursor 
     INTO @CursorVal_EmpID 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
     -- #### Add column to the new table query based on the current cursor position (branch number) 
     EXEC ('ALTER TABLE #tbl_CrossTabExample ADD [' + @CursorVal_EmpID + '] VARCHAR(50) NULL') 

     -- #### Populate the new employee column 
     EXEC ('UPDATE #tbl_CrossTabExample SET [' + @CursorVal_EmpID + '] = (SELECT EMPID FROM [tbl_ExampleData] B WHERE B.EMPID = ''' + @CursorVal_EmpID + ''') WHERE #tbl_CrossTabExample.[-] = ''EMPID''') 
     EXEC ('UPDATE #tbl_CrossTabExample SET [' + @CursorVal_EmpID + '] = (SELECT ENAME FROM [tbl_ExampleData] B WHERE B.EMPID = ''' + @CursorVal_EmpID + ''') WHERE #tbl_CrossTabExample.[-] = ''ENAME''') 
     EXEC ('UPDATE #tbl_CrossTabExample SET [' + @CursorVal_EmpID + '] = (SELECT SALARY FROM [tbl_ExampleData] B WHERE B.EMPID = ''' + @CursorVal_EmpID + ''') WHERE #tbl_CrossTabExample.[-] = ''SALARY''') 
     EXEC ('UPDATE #tbl_CrossTabExample SET [' + @CursorVal_EmpID + '] = (SELECT DEPARTMENT FROM [tbl_ExampleData] B WHERE B.EMPID = ''' + @CursorVal_EmpID + ''') WHERE #tbl_CrossTabExample.[-] = ''DEPARTMENT''') 

     -- #### move onto next branch 
     FETCH NEXT FROM @CrossTabCursor 
       INTO @CursorVal_EmpID 
    END 
CLOSE @CrossTabCursor 
DEALLOCATE @CrossTabCursor 


-- #### Select the completed cross tab data 
SELECT * 
FROM #tbl_CrossTabExample 

-- #### Drop the Temp Table 
DROP TABLE #tbl_CrossTabExample 

この回答は、例えば、あなたが動的にはるかに優れて実行することになりPIVOTコマンドウィッヒを構築するために同様のロジックを使用することができ、概念の非常に粗い証拠です。たぶん