惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
G
Google Developers Blog
博客园 - 司徒正美
J
Java Code Geeks
aimingoo的专栏
aimingoo的专栏
A
About on SuperTechFans
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
T
The Blog of Author Tim Ferriss
D
Docker
大猫的无限游戏
大猫的无限游戏
D
DataBreaches.Net
腾讯CDC
V
Visual Studio Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
C
Check Point Blog
M
MIT News - Artificial intelligence
Jina AI
Jina AI
I
InfoQ
雷峰网
雷峰网
The Cloudflare Blog
美团技术团队
Engineering at Meta
Engineering at Meta

博客园 - 凯锐

旋转的Silverlight文字 面试.NET高级软件工程师 C#利用批处理实现正在运行的程序自动更新 WindowsXp下安装Ubuntu8.10 英语学习者的十句经典名言 Crystal Report動態顯示圖片 基於IIS的WCF的分布式多層架構開發實現 ASP.net 網站和Web Application的區別(轉) Word2003中進行目錄排版 Asp.net動態添加控件 利用.NET代碼實現點擊按鈕彈出新窗體,輸入數據后返回並刷新頁面 SmartGridView(VB) C#/VB.NET语法的比较 我也来试一下利用word2007发布blog WinForm下多层架构的实现 從無到有實現一個xml數據庫登錄驗証 看完越獄20件必須懂的東西(轉) 產生指定個數的不重復隨機數 DIY网站的方法 - 凯锐 - 博客园
在SQL 2000中交叉表的應用
凯锐 · 2006-12-15 · via 博客园 - 凯锐

        昨天被一從前同事問及sql2K中交叉表的使用﹐回顧了一下sql﹐現根據QQ聊天記錄整理了一下﹐順便征求各位一個超過varchar型最大值8000后該如何實現的動態sql語句。
        建立測試環境﹕

CREATE TABLE [ODBC_TEST] (
    
[ID_Date] [datetime] NULL ,
    
[Order_F] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
    
[QTY] [numeric](180NULL
ON [PRIMARY]
GOinsert into odbc_test
select '2006-12-01','aa',10
union all
select '2006-12-02','bb',20
union all
select '2006-12-03','cc',30
union all
select '2007-01-01','aa',10
union all
select '2007-01-02','bb',20
union all
select '2007-01-03','cc',30--select * from ODBC_TEST

        他要的就是按年月分Oder_F統計QTY。當時我正在開緊電影﹐給出了第一個方案﹕

declare @s varchar(8000)
set @s='select ID_Date '
select @s=@s+','+Order_F+'=sum(case when Order_F='''+Order_F+''' then QTY else 0 end)'
from ODBC_TEST
group by Order_F
set @s=@s+' from ODBC_TEST group by ID_Date order by ID_Date desc '
--print cast(len(@sas varchar)
exec(@s)

        結果﹕

ID_Date                                                aa                                       bb                                       cc                                       
------------------------------------------------------ ---------------------------------------- ---------------------------------------- ---------------------------------------- 
2007-01-03 00:00:00.000                                0                                        0                                        30
2007-01-02 00:00:00.000                                0                                        20                                       0
2007-01-01 00:00:00.000                                10                                       0                                        0
2006-12-03 00:00:00.000                                0                                        0                                        30
2006-12-02 00:00:00.000                                0                                        20                                       0
2006-12-01 00:00:00.000                                10                                       0                                        0

        并沒有分年月﹐只是按日分而已﹐知道并沒有實現他的要求﹐在自已電腦中寫出了一個方案二﹕


create table #t (id_date datetime,order_f varchar(20),qty numeric(18,0))
insert into #t select id_date=case when (day(id_date)<>1then dateadd(day,-day(id_date)+1, id_date)
                
else id_date
                  
end
,order_f, qty 
from ODBC_TESTdeclare @s varchar(8000)
set @s='select ID_Date '
select @s=@s+','+Order_F+'=sum(case when Order_F='''+Order_F+''' then QTY else 0 end)'
from #t
group by Order_F
set @s=@s+' from #t group by ID_Date order by ID_Date desc '
--print cast(len(@s) as varchar)
exec(@s)
drop table #t

        結果如下﹕

ID_Date                                                aa                                       bb                                       cc                                       
------------------------------------------------------ ---------------------------------------- ---------------------------------------- ---------------------------------------- 
2007-01-01 00:00:00.000                                10                                       20                                       30
2006-12-01 00:00:00.000                                10                                       20                                       30

        感覺怪怪的﹐并沒有達到預期想要的顯示效果﹐所以﹐我當時要他多等一會兒時間﹐這個時候﹐該從前同事發過來了他的方案代碼﹕

declare @s varchar(8000)
set @s='select Order_f, '
select @s=@s+'sum(case left(convert(varchar(10),id_date,120),7) when '''+id_date+''' then qty else 0 end) as '''+ id_date+''','
from
(
select distinct left(convert(varchar(10),id_date,120),7as  id_date from odbc_test ) a
set @s = left(@s,len(@s)-1+'from odbc_test group by order_f order by order_f'
exec(@s)

運行結果﹕

Order_f              2006-12                                  2007-01                                  
-------------------- ---------------------------------------- ---------------------------------------- 
aa                   10                                       10
bb                   
20                                       20
cc                   
30                                       30

faint....真有點暈﹐看來以后使用sql還是要從多方面著想﹐說不定什么時間就有靈感﹐使出不一樣而且簡潔輕便的實現方法﹐比傳統的思維要好很多。就比如說這個﹐唉﹐為什么不想一下日期型轉成字符型﹐然后取7位不就是年月了嗎?再次faint...
當然使用以上的動態SQL語句﹐如果數據過多﹐串聯起來的字符超過了8K,就會出錯的﹐曾記得CSDN上鄒健還是誰﹐有發表過如何解決這個超過8K字符的文章﹐可惜我現在沒有找到﹐如果哪位有找到﹐或有解決方法﹐請不吝賜教﹗先謝了﹗