首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

简略SQL查询

2013-11-26 
简单SQL查询本帖最后由 xl_smlie 于 2013-11-22 17:12:32 编辑--基础表1(这样的一个树形结构):TabZLkjndfz

简单SQL查询
本帖最后由 xl_smlie 于 2013-11-22 17:12:32 编辑


--基础表1(这样的一个树形结构):TabZL
kjnd     fzdm     fzmc
2013     201      mc201
2013     20101    mc20101
2013     2010101  mc2010101
2013     20102    mc20102
2013     2010201  mc2010201
2013     2010202  mc2010202
2013     202      mc202
...
2013     301      mc301
2013     30101    mc30101
2013     30102    mc30102
2013     302      mc302
2013     30201    mc30201
2013     30202    mc30202
...

--业务表TabSJ
kjnd     kmdm     fzdm4     fzdm5
2013     A001     2010101   30101
2013     A001     2010101   30102
2013     A001     2010102   30101
2013     A001     2010101   30202
...

--希望得到结果表(fzdm4,fzmc4,fzdm5,fzmc5实际上都是基础表TabZL里的,2开头为FZDM4,3开头为
--FZDM5,SFMX:是否明细,0代表:否;1代表:是):
kjnd     fzdm4     fzdm4mc     fzdm5     fzdm5mc      sfmx
2013     201       mc201                                0
2013     20101     mc20101                              0
2013     2010101   mc2010101   301       mc301          0
2013     2010101   mc2010101   30101     mc30101        1
2013     2010101   mc2010101   30102     mc30102        1
2013     2010101   mc2010101   302       mc302          0
2013     2010101   mc2010101   30202     mc30202        1
2013     2010101   mc2010102   301       mc301          0
2013     2010101   mc2010102   30101     mc30101        1
...

[解决办法]
--> 测试数据:#TabZL
IF OBJECT_ID('tempdb.dbo.#TabZL') IS NOT NULL DROP TABLE #TabZL
GO 
CREATE TABLE #TabZL([kjnd] INT,[fzdm] INT,[fzmc] VARCHAR(9))
INSERT #TabZL
SELECT 2013,201,'mc201' UNION ALL
SELECT 2013,20101,'mc20101' UNION ALL
SELECT 2013,2010101,'mc2010101' UNION ALL
SELECT 2013,20102,'mc20102' UNION ALL
SELECT 2013,2010201,'mc2010201' UNION ALL
SELECT 2013,2010202,'mc2010202' UNION ALL
SELECT 2013,202,'mc202' UNION ALL
SELECT 2013,301,'mc301' UNION ALL
SELECT 2013,30101,'mc30101' UNION ALL
SELECT 2013,30102,'mc30102' UNION ALL
SELECT 2013,302,'mc302' UNION ALL
SELECT 2013,30201,'mc30201' UNION ALL
SELECT 2013,30202,'mc30202'

--> 测试数据:#TabSJ
IF OBJECT_ID('tempdb.dbo.#TabSJ') IS NOT NULL DROP TABLE #TabSJ
GO 
CREATE TABLE #TabSJ([kjnd] INT,[kmdm] VARCHAR(4),[fzdm4] INT,[fzdm5] INT)
INSERT #TabSJ
SELECT 2013,'A001',2010101,30101 UNION ALL
SELECT 2013,'A001',2010101,30102 UNION ALL
SELECT 2013,'A001',2010102,30101 UNION ALL
SELECT 2013,'A001',2010101,30202
--------------开始查询--------------------------

SELECT *,sfmx=CASE WHEN c.[fzmc] IS NULL THEN 0 ELSE 1 END  FROM 


(
SELECT * FROM #TabZL WHERE LEFT([fzdm],1)=2
) a 
LEFT JOIN #TabSJ b
ON  a.[kjnd]=b.[kjnd] AND [fzdm]=b.[fzdm4] 
LEFT JOIN 
(
SELECT * FROM #TabZL WHERE LEFT([fzdm],1)=3
)c
ON b.[fzdm5]=c.[fzdm]

----------------结果----------------------------
/* 
kjndfzdmfzmckjndkmdmfzdm4fzdm5kjndfzdmfzmcsfmx
2013201mc201NULLNULLNULLNULLNULLNULLNULL0
201320101mc20101NULLNULLNULLNULLNULLNULLNULL0
20132010101mc20101012013A001201010130101201330101mc301011
20132010101mc20101012013A001201010130102201330102mc301021
20132010101mc20101012013A001201010130202201330202mc302021
201320102mc20102NULLNULLNULLNULLNULLNULLNULL0
20132010201mc2010201NULLNULLNULLNULLNULLNULLNULL0
20132010202mc2010202NULLNULLNULLNULLNULLNULLNULL0
2013202mc202NULLNULLNULLNULLNULLNULLNULL0
*/

[解决办法]

不对吧

请问你的
2013     2010101   mc2010101   301       mc301          0
这一行记录是怎么得到的?

是根据业务表TabSJ的这条记录来的
2013     A001     2010101   30101

业务表记录的fzdm4,fzdm5等都是在基础表的最明细级;
想得到结果是按照fzdm4+fzdm5的形式上下级汇总
如:业务表有fzdm4值:2080506,fzdm5值:30810
希望得到的是:
fzdm4         fzdm4mc         fzdm5         fzdm5mc    ...
208           mc208      
20805         mc20805
2080506       mc2080506       308           mc308
2080506       mc2080506       30810         mc30810

fzdm4的基础表级次是3-2-2
fzdm5的基础表级次是3-2
所以fzdm4与fzdm5的基础数据是放在同一基础表的。


业务表有fzdm4值:2080506,fzdm5值:30810 的时候
为何没有
fzdm4         fzdm4mc         fzdm5         fzdm5mc  
208           mc208           308            mc308
这行呢

热点排行