CSDN SQL版常見問題之四--行列互換

/*
--轉載請注明,謝謝
--作者:  Paoluo
--日期:  2007-08-31
--用途:  將表中的列名轉為Type的數據
*/

--創建測試環境
Create Table TEST
(ID Int,
 A Int,
 B Int,
 C Int)

--插入數據
Insert TEST Select 1, 100, 90, 0
Union All Select 2, 80, 85, 92
Union All Select 3, 87, 0, 0
GO
--測試
--察看原表數據
Select * From TEST

--如果列名已知
--寫出列名已知情況下的語句,是希望能幫助大家更好的理解動態SQL語句
--下面EXEC(@S)中執行即為此語句
Select * From (
 Select ID, 'A' As Type, A As Score From TEST
 Union
 Select ID, 'B' As Type, B As Score From TEST
 Union
 Select ID, 'C' As Type, C As Score From TEST
) A
Where
 Score != 0
Order By
 ID, Type

--如果Type不是固定的,使用動態SQL語句
--定義變量
Declare @S Varchar(8000)
--賦初值,此句不能少
Select @S = ''
--從系統表SysColumns中循環得到列名(Name),並使用Name拼結語句
Select @S = @S + ' Union Select ID, ''' + Name + ''' As Type, ' + Name + ' As Score From TEST'
From SysColumns Where ID = OBJECT_ID('TEST') Order By ColID
--去掉前面多於的Union, 並去掉為0的Score,加上排序
Select @S = 'Select * From (' + Stuff(@S, 1, 7 ,'') + ' ) A Where Score != 0 Order By ID, Type'
--執行動態SQL語句
EXEC(@S)
GO
--刪除測試環境
Drop Table TEST
--結果
/*
--表中原來數據
ID A B C
1 100 90 0
2 80 85 92
3 87 0 0

--實現效果
ID Type Score
1 A 100
1 B 90
2 A 80
2 B 85
2 C 92
3 A 87
*/ 

行列轉換問題

09-07

SELECT TOP (100) PERCENT DGMOCPA.PA010, DGMOCPA.PA011, DGMOCPA.PA023, DGMOCPA.PA024, DGMOCPB.PB026, DGMOCPA.PA033, rn DGMOCPA.PA022, SUM(case when DGMOCPB.pb005='白班' then pb018 else 0 end)AS 白班,SUM(case when DGMOCPB.pb005='夜班' then pb018 else 0 end)AS 夜班,DGMOCPB.PB006rnFROM DGMOCPB INNER JOINrn DGMOCPA ON DGMOCPA.PA001 = DGMOCPB.PB001 and PB026>='2009/08/01' and pb026<='2009/08/10' and PB006 like '%YJ-A%' rnGROUP BY DGMOCPA.PA010, DGMOCPA.PA011, DGMOCPA.PA023, DGMOCPA.PA024, DGMOCPA.PA033, DGMOCPA.PA022, rn DGMOCPB.PB026, DGMOCPB.PB006rnORDER BY DGMOCPB.PB026, DGMOCPB.PB006rnrn執行后結果如下:rn25025278+000109 I/O COVER DF800,BLACK HD08-084 2 2009-08-01 00:00:00.000 33 2 4 0 YJ-A36 rn705GZ934073 COVER-SIDE-IO_ASS'Y,AV600A TW08-257 1 2009-08-01 00:00:00.000 30 1.5 1.5 0 YJ-A40 rnA34T1125PAN1L0100 COVER KEY 32''CV,K21411 TW08-171 2 2009-08-01 00:00:00.000 35 2 12 12 YJ-A41 rn251223321814008-0000 LOWER COVER-TG585V7 HD07-395 2 2009-08-02 00:00:00.000 40 3 12 12 YJ-A02 rn25102525W300NH0 BACK-ASM HD08-287 2 2009-08-02 00:00:00.000 32 7 12 12 YJ-A03 rn251223321814008-0000 LOWER COVER-TG585V7 HD07-233 2 2009-08-02 00:00:00.000 40 3 12 12 YJ-A07 rn25101525W300NH0-0000 FRONT CASE,BLACK C(鋼琴黑) HD08-286 2 2009-08-02 00:00:00.000 45 2 12 12 YJ-A10 rn705TZ834058 COVER-SIDE-IO ASS'Y TOSHIBA 37 TW-170 2 2009-08-02 00:00:00.000 35 2 12 12 YJ-A15 rn只複製了8月1號-2號的rn現在希望將格式調整一下:rn要求:按PA010,PA011,PA023,PA024,PB026,PA033,PA022,PB006分白班夜班顯示一段時間累的周期行變化。rn執行的結果如下:rn (天)rn 1 2 3 4 .......rn25025278+000109 I/O COVER DF800,BLACK HD08-084 2 YJ-A36 33 2 白班 4 0 0 0 rn 夜班rn705GZ934073 COVER-SIDE-IO_ASS'Y,AV600A TW08-257 1 YJ-A40 30 1.5 白班 1.5 0 0 0 rn 夜班 rnA34T1125PAN1L0100 COVER KEY 32''CV,K21411 TW08-171 2 YJ-A41 35 2 白班 12 0 0 0rn 夜班 12 0 0 0rn251223321814008-0000 LOWER COVER-TG585V7 HD07-395 2 YJ-A02 40 3 白班 0 12 0 0rn 夜班 0 12 0 0rn25102525W300NH0 BACK-ASM HD08-287 2 YJ-A03 32 7 白班 0 12 0rn 夜班 0 12 0 rn簡單的列舉了幾個!本來做的固定的按1-31天跑,每個月有多少天就填充多少天的數據進去。但是現在需要從上面看出3個月以內的周期性變化,固定的就不適合了。rnrnrnrnrn

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试