在SQL Server 2008 R2上将列转置为行

我写了一个查询,需要使用从asp.net SQL命令导出到Excel文件,但首先,我只是想转置列行我试图使用数据透视,但它不工作

我写这样的查询

SELECT CATAGORY_NAME,GROUP_NAME,FUNCTION_NAME,'G'+TEST_CASE.GID + '-TC'+TEST_CASE.CASE_ID CASE_ID,CASE_NAME,CASE_NAME_TH,EXPECT_RESULT,EXPECT_DETAIL,INTERFACE,RESULT,TEST_DATE,TEST_BY,REMARK FROM TEST_CASE LEFT OUTER JOIN TEST_CATAGORY ON TEST_CASE.CID = TEST_CATAGORY.CID AND TEST_CASE.SID = TEST_CATAGORY.SID LEFT OUTER JOIN TEST_GROUP ON TEST_CASE.GID = TEST_GROUP.GID AND TEST_CASE.CID = TEST_GROUP.CID WHERE TEST_CASE.SID = 1 ORDER BY TEST_CASE.CID 

它工作正常,我需要通过CATAGORY NAME转移它们

从(例如所有因为有很多列)

 CATAGORY_NAME GROUP_NAME FUNCTION_NAME CASE_ID TS12345 TDAS NOS 1234 CATAGORY_NAME GROUP_NAME FUNCTION_NAME CASE_ID TS12346 TDAF NOS 1235 

 CATAGORY NAME TS12345 GROUP NAME TDAS FUNCTION NAME NOS CASE ID 1234 CATAGORY NAME TS12346 GROUP NAME TDAF FUNCTION NAME NOS CASE ID 1235 

来自查询的表数据

  CATAGORY_NAME GROUP_NAME FUNCTION_NAME CASE_ID CASE_NAME EXPECT_RESULT INTERFACE RESULT TEST_DATE TEST_BY REMARK Desbes Optivy TESTING125 FAST CASH G01-TC00101 Fast Rejected VISA N/R 12-ธ.ค.-14 Tester1 4012999971111142 4012999971111142 IBM Omron ADM3 (S1G366932) VISA Chip (Single App) FAST CASH G03-TC00501 Fast Approved VISA PASS 11-ธ.ค.-14 Tester1 4761340000000035 4761340000000035 Wincor PC280 (S1A365305) Abnormal SCB Card Abnormal Fast cash G28-TC11804 Inactive status Rejected CBS PASS 25-ธ.ค.-14 tester3 5.57755E+15 Wincor PC280 (S1A365305) Abnormal VISA Magnetic Abnormal Withdrawal G30-TC15402 Do not input amount Rejected #NAME? BASE24 PASS tester3 

TB TEST_CASE

  SID CID GID CASE_ID FUNCTION_NAME CASE_NAME CASE_NAME_TH TEST_CARD CONDITION EXPECT_RESULT ACTUAL_RESULT SEQ TEST_BY TEST_DATE REMARK RESULT INTERFACE TEMPLATE_NAME RETEST_DATE 1 1 1 101 FAST CASH Fast cash - 200 FASTCAS 12345 NULL Rejected Approved 20-21 TESTER1 12-ธ.ค.-14 TEST N/R VISA Recycle ;PN13 Jan 15 1 1 1 102 FAST CASH Fast cash - 500 FASTCAS 12345 NULL Approved Approved 22-23 TESTER2 12-ธ.ค.-14 TEST PASS VISA Recycle NULL 1 1 1 103 FAST CASH Fast cash - 1,000 FASTCAS 12345 NULL Approved Approved 26-27 TESTER3 12-ธ.ค.-14 TEST PASS VISA Recycle NULL 

TB TEST_CATAGORY

 SID CID CATAGORY_NAME INFO_1 INFO_2 INFO_3 INFO_4 INFO_5 TEMPLATE_NAME INFO_L1 INFO_L2 INFO_L3 INFO_L4 INFO_L5 1 1 Diebold Optiva378 (S1G366937) S1G366937 Diebold Win7 $DATA.AT401000.CDMD3IN1 Optiva378 Recycle Term Vendor OS CI File NULL 1 2 NCR S6622E (S1G365311) S1G365311 NCR Win7 $DATA.AT40N50. CI587IPF S6622E ATM Full Term Vendor OS CI File NULL 1 3 Wincor PC1500XE (S1A365303) S1A365303 Wincor XP $DATA.AT401000. CIWINCOR PC 1500XE ATM Partial Term Vendor OS CI File NULL 1 4 IBM Nautilus CD4 (S1G365306) S1G365306 IBM XP $DATA.AT401000. OMIP02 Nautilus ATM Partial Term Vendor OS CI File NULL 

TB TEST_GROUP

 SID CID GID GROUP_NAME GROUP_CODE TEMPLATE_NAME 1 01 VISA Magnetic NULL ATM Full 1 01 VISA Magnetic NULL ATM Multi 1 01 VISA Magnetic NULL ATM Partial 1 01 VISA Magnetic NULL Existing ATM 1 01 VISA Magnetic NULL Existing CDM 1 01 VISA Magnetic NULL Existing Multi 1 01 VISA Magnetic NULL Existing Recycle 1 01 VISA Magnetic NULL Recycle 1 02 VISA Chip-Fallback NULL ATM Full 1 02 VISA Chip-Fallback NULL ATM Multi 1 02 VISA Chip-Fallback NULL ATM Partial 1 02 VISA Chip NULL Existing ATM 1 02 VISA Chip NULL Existing CDM 1 02 VISA Chip NULL Existing Multi 1 02 VISA Chip NULL Existing Recycle 1 02 VISA Chip-Fallback NULL Recycle 1 03 VISA Chip (Single App) NULL ATM Full 1 03 VISA Chip (Single App) NULL ATM Multi 1 03 VISA Chip (Single App) NULL ATM Partial 1 03 MDS Magnetic NULL Existing ATM 1 03 MDS Magnetic NULL Existing CDM 1 03 MDS Magnetic NULL Existing Multi 1 03 MDS Magnetic NULL Existing Recycle 1 03 VISA Chip (Single App) NULL Recycle 1 04 VISA Chip (Multi App) NULL ATM Full 1 04 VISA Chip (Multi App) NULL ATM Multi 1 04 VISA Chip (Multi App) NULL ATM Partial 1 04 MDS Chip NULL Existing ATM 1 04 MDS Chip NULL Existing CDM 1 04 MDS Chip NULL Existing Multi 1 04 MDS Chip NULL Existing Recycle 1 04 VISA Chip (Multi App) NULL Recycle 1 05 MDS Magnetic NULL ATM Full 

尝试这个

 SELECT 'CATAGORY_NAME' COL,CATAGORY_NAME FROM Yourtable UNION ALL SELECT 'GROUP_NAME',GROUP_NAME FROM Yourtable UNION ALL SELECT 'FUNCTION_NAME',FUNCTION_NAME FROM Yourtable UNION ALL SELECT 'CASE_ID',CASE_ID FROM Yourtable 

编辑:

对于您更新的问题,可以遵循以下方法。

样品表

 CREATE TABLE #TEMP(CATAGORY_NAME VARCHAR(200),GROUP_NAME VARCHAR(200), FUNCTION_NAME VARCHAR(200),CASE_ID VARCHAR(200)) INSERT INTO #TEMP SELECT 'Desbes Optivy', 'TESTING125', 'FAST CASH' , 'G01-TC00101' UNION ALL SELECT 'IBM Omron ADM3 (S1G366932)', 'VISA Chip (Single App)', 'FAST CASH', 'G03-TC00501' UNION ALL SELECT 'Wincor PC280 (S1A365305)', 'Abnormal SCB Card', 'Abnormal Fast cash', 'G28-TC11804' UNION ALL SELECT 'Wincor PC280 (S1A365305)', 'Abnormal VISA Magnetic', 'Abnormal Withdrawal', 'G30-TC15402' 

QUERY

 ;WITH CTE AS ( -- Here we get a unique id for each row SELECT ROW_NUMBER() OVER(ORDER BY (SELECT(0))) RNO,* FROM #TEMP ) ,CTE2 AS ( -- Hardcode the column names SELECT 'CATAGORY NAME' COL,CATAGORY_NAME,RNO FROM CTE UNION ALL SELECT 'GROUP NAME',GROUP_NAME,RNO FROM CTE UNION ALL SELECT 'FUNCTION NAME',FUNCTION_NAME,RNO FROM CTE UNION ALL SELECT 'CASE ID',CASE_ID,RNO FROM CTE ) -- Select all the data and order by a column according to our logic -- Row number gets you unique id for each rows SELECT * FROM CTE2 ORDER BY RNO, CASE WHEN COL = 'CATAGORY NAME' THEN 1 WHEN COL = 'GROUP NAME' THEN 2 WHEN COL = 'FUNCTION NAME' THEN 3 WHEN COL = 'CASE ID' THEN 4 END 

编辑2:

试试这个

  ;WITH CTE AS ( SELECT ROW_NUMBER() OVER(ORDER BY TEST_CASE.CID) RNO, CATAGORY_NAME,GROUP_NAME,FUNCTION_NAME, 'G'+TEST_CASE.GID + '-TC'+TEST_CASE.CASE_ID CASE_ID, CASE_NAME,CASE_NAME_TH,EXPECT_RESULT,EXPECT_DETAIL, INTERFACE,RESULT,TEST_DATE,TEST_BY,REMARK FROM TEST_CASE LEFT OUTER JOIN TEST_CATAGORY ON TEST_CASE.CID = TEST_CATAGORY.CID AND TEST_CASE.SID = TEST_CATAGORY.SID LEFT OUTER JOIN TEST_GROUP ON TEST_CASE.GID = TEST_GROUP.GID AND TEST_CASE.CID = TEST_GROUP.CID WHERE TEST_CASE.SID = 1 ) ,CTE2 AS ( -- Hardcode the column names SELECT 'CATAGORY NAME' COL,CATAGORY_NAME,RNO FROM CTE UNION ALL SELECT 'GROUP NAME',GROUP_NAME,RNO FROM CTE UNION ALL SELECT 'FUNCTION NAME',FUNCTION_NAME,RNO FROM CTE UNION ALL SELECT 'CASE ID',CASE_ID,RNO FROM CTE ) -- Select all the data and order by a column according to our logic -- Row number gets you unique id for each rows SELECT * FROM CTE2 ORDER BY RNO, CASE WHEN COL = 'CATAGORY NAME' THEN 1 WHEN COL = 'GROUP NAME' THEN 2 WHEN COL = 'FUNCTION NAME' THEN 3 WHEN COL = 'CASE ID' THEN 4 END 

我将使用Cross apply来解决这个问题

 SELECT column_name, data FROM result CROSS apply (VALUES ('CATAGORY_NAME',CATAGORY_NAME), ('GROUP_NAME',GROUP_NAME), ('FUNCTION_NAME',FUNCTION_NAME), ('CASE_ID',CONVERT(VARCHAR(50), CASE_ID))) cs(column_name, data) 

SQLFIDDLE DEMO