ikey a b c ----------- ----------- ----------- ----------- 244 382 961 368 275 623 372 947 212 148 744 466 783 75 479 678 301 931 631 998 569 872 154 435 363 654 257 388 437 655 109 327 382 149 534 725 846 471 106 187
--一危一煙ろ襴渚 set nocount on set statistics io on if object_id('temp..#temp') is not null drop table #temp create table #temp( ikey int , a int , b int , c int ) go declare @i int , @i_key int , @a int , @b int , @c int set @i = 1 while(@i <= 100000) begin set @i_key = replace(right(cast(rand() as varchar), 3) , '.', '') set @a = replace(right(cast(rand() as varchar), 3), '.', '') set @b = replace(right(cast(rand() as varchar), 3), '.', '') set @c = replace(right(cast(rand() as varchar), 3), '.', '') insert #temp values(@i_key, @a, @b, @c) set @i = @i + 1 end create index idx on #temp(ikey) go
select top 100 ikey, count(*) cnt from #temp group by ikey order by 2 desc ikey cnt ----------- ----------- 804 145 935 141 687 140 918 140 754 138 207 137 588 137
set statistics profile on --SQL1: UNION ALL伎 select ikey, min(val) as min_val from( select ikey, min(a) as val from #temp where a > 0 and ikey = 804 group by ikey union all select ikey, min(b) from #temp where b > 0 and ikey = 804 group by ikey union all select ikey,min(c) from #temp where c > 0 and ikey = 804 group by ikey ) a group by ikey --蟆3, 朱Μ所鍵444, 覓朱Μ所鍵0, 覩碁Μ所鍵0, LOB 朱Μ所鍵0, LOB 覓朱Μ所鍵0, LOB 覩碁Μ所鍵0. --SQL2: Cross Join伎 select ikey , min( case when id = 1 and a > 0 then a when id = 2 and b > 0 then b when id = 3 and c > 0 then c end) min_val from ( select * from #temp where ikey = 804 ) a cross join (select 1 id union all select 2 union all select 3) b group by ikey --蟆1, 朱Μ所鍵148, 覓朱Μ所鍵0, 覩碁Μ所鍵0, LOB 朱Μ所鍵0, LOB 覓朱Μ所鍵0, LOB 覩碁Μ所鍵0.
USE tempdb; IF EXISTS(SELECT * FROM sysobjects WHERE ID = (OBJECT_ID('#temp')) AND xtype = 'U') DROP TABLE #temp GO CREATE TABLE #temp( [#] [tinyint] NULL, [1] [tinyint] NULL, [2] [tinyint] NULL, [3] [tinyint] NULL, [4] [tinyint] NULL, [5] [tinyint] NULL, [6] [tinyint] NULL, [7] [tinyint] NULL, [8] [tinyint] NULL, [9] [tinyint] NULL ) INSERT INTO #temp VALUES(1, 8, 5, 2, 8, 6, 8, 9, 9, 1); INSERT INTO #temp VALUES(2, 3, 8, 6, 4, 9, 3, 6, 9, 6); INSERT INTO #temp VALUES(3, 2 , 8, 9, 3, 4, 3, 7, 4, 9); INSERT INTO #temp VALUES(4, 1, 9, 4, 5, 7, 9, 9, 5, 6); INSERT INTO #temp VALUES(5, 7, 6, 2, 9, 7, 9, 9, 6, 8); INSERT INTO #temp VALUES(6, 5, 2, 9, 6, 5, 8, 6, 8, 9); INSERT INTO #temp VALUES(7, 4, 4, 2, 5, 9, 5, 8, 6, 9); INSERT INTO #temp VALUES(8, 5, 9, 9, 3, 7, 7, 6, 2, 6); INSERT INTO #temp VALUES(9, 2, 3, 2, 7, 9, 6, 6, 2, 9); /* # 1 2 3 4 5 6 7 8 9 ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 1 8 5 2 8 6 8 9 9 1 2 3 8 6 4 9 3 6 9 6 3 2 8 9 3 4 3 7 4 9 4 1 9 4 5 7 9 9 5 6 5 7 6 2 9 7 9 9 6 8 6 5 2 9 6 5 8 6 8 9 7 4 4 2 5 9 5 8 6 9 8 5 9 9 3 7 7 6 2 6 9 2 3 2 7 9 6 6 2 9 */
with temp(no) as ( select 1 no union all select no + 1 from temp where no + 1 <= 9 )--2005覯襷 . temp朱 企 0 ~ 9 螳 Dumy企企 螳覃 . select [#] [Row number] , b.no [Column number] , case when b.no=1 then [1] when b.no=2 then [2] when b.no=3 then [3] when b.no=4 then [4] when b.no=5 then [5] when b.no=6 then [6] when b.no=7 then [7] when b.no=8 then [8] when b.no=9 then [9] end [Value] from #temp a cross join temp b /* Row number Column number Value ---------- ------------- ----- 1 1 8 2 1 3 3 1 2 4 1 1 5 1 7 6 1 5 7 1 4 ... */