国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

sqlserver 將多行數(shù)據(jù)查詢合并為一條數(shù)據(jù)

2024-07-21 02:51:00
字體:
供稿:網(wǎng)友
sqlserver 將多行數(shù)據(jù)查詢合并為一條數(shù)據(jù) 2014-01-24 16:43 by 那時me年少, ... 閱讀, ... 評論, 收藏, 編輯

有這樣一個需求:表T_FUN_TASK為任務(wù)表,有字段(TASKID,TASKNAME),表T_FUN_LOGBOOK為日志表,有字段(LOGID,TASKID,LOGDATE),一個任務(wù)可持續(xù)多天,每天會記錄一條日志。在查詢表T_FUN_TASK時,需將任務(wù)表中的 LOGDATE 查詢出來作為一列 LOGDATES顯示。

表 T_FUN_TASK

T_FUN_TASK

T_FUN_LOGBOOK

查詢結(jié)果

此結(jié)果查詢方法可以用存儲過程輕松實現(xiàn),這里我要介紹的是sqlserver FOR xml PATH語句的應(yīng)用,在SQL Server中利用 FOR XML PATH 語句能夠把查詢的數(shù)據(jù)生成XML數(shù)據(jù)

且合并為一條數(shù)據(jù),看以下示例:

SELECT LOGDATE FROM T_FUN_LOGBOOK WHERE TASKID=231 FOR XML PATH

結(jié)果為:

<row> <logdate>2014-01-06T00:00:00</logdate></row><row> <logdate>2014-01-07T00:00:00</logdate></row>

在前面的需求中,我是想要把這2條數(shù)據(jù)合并到一起且沒有XML標簽,條與條之間用下劃線(_)分隔的,日期的格式也變?yōu)榱?014/01/07的格式。下面來一步一步來完成需求。

首先,將日期格式轉(zhuǎn)化為需要的格式:

SELECT CONVERT(VARCHAR(100), LOGDATE, 111) FROM T_FUN_LOGBOOK WHERE TASKID=231 FOR XML PATH

結(jié)果變?yōu)椋?/p>

<row>2014/01/06</row><row>2014/01/07</row>

可以發(fā)現(xiàn),轉(zhuǎn)化字符卷的過程中,把logdate標簽給去掉了。現(xiàn)在我們要去掉<row>標簽:

SELECT CONVERT(VARCHAR(100), LOGDATE, 111) FROM T_FUN_LOGBOOK WHERE TASKID=231 FOR XML PATH('')

在PATH后面將一個空的字符卷作為參數(shù)傳遞,就可以去掉<row>標簽,結(jié)果:2014/01/062014/01/07。

現(xiàn)在兩條結(jié)果之間很難區(qū)分,需要用下劃線將其分隔開來,方法是在CONVERT函數(shù)前面加上一個下劃線:

SELECT '_'+CONVERT(VARCHAR(100), LOGDATE, 111) FROM T_FUN_LOGBOOK WHERE TASKID=231 FOR XML PATH('')

結(jié)果:_2014/01/06_2014/01/07。

在分析了FOR XML PATH語句之后,就來將這個查詢結(jié)果添加到對T_FUN_TASk的查詢結(jié)果中去。我的思路是先構(gòu)建一個子查詢,然后查詢TASK表時LEFT JOIN這個子查詢:

SELECT T1.TASKID,'TASKNAME' AS TASKNAME,T2.LOGDATES FROM T_FUN_TASK T1LEFT JOIN (SELECT TASKID, LOGDATES=(SELECT '_'+CONVERT(VARCHAR(100), LOGDATE, 111) FROM T_FUN_LOGBOOK WHERE TASKID=T1.TASKID FOR XML PATH('')) FROM T_FUN_LOGBOOK T1 GROUP BY TASKID) T2 ON T2.TASKID=T1.TASKIDORDER BY T1.TASKID ASC

運行以上SQL后得到的結(jié)果為:

發(fā)現(xiàn)LOGDATES值的第一個下劃線應(yīng)該去掉,于是修改SQL,應(yīng)用 STUFF函數(shù)去掉第一個下劃線:

SELECT T1.TASKID,'TASKNAME' AS TASKNAME,T2.LOGDATES FROM T_FUN_TASK T1LEFT JOIN (SELECT TASKID, LOGDATES=STUFF((SELECT '_'+CONVERT(VARCHAR(100), LOGDATE, 111) FROM T_FUN_LOGBOOK WHERE TASKID=T1.TASKID FOR XML PATH('')),1,1,'') FROM T_FUN_LOGBOOK T1 GROUP BY TASKID) T2ON T2.TASKID=T1.TASKIDORDER BY T1.TASKID ASC

將結(jié)果轉(zhuǎn)化為JSON 返回給前端之后,JS按照下劃線分隔這個字段的值,即可以得到一個任務(wù)下面日志的填寫情況。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 饶平县| 达州市| 耒阳市| 教育| 古蔺县| 额尔古纳市| 鹰潭市| 丰原市| 健康| 新民市| 龙南县| 普兰店市| 浦北县| 潼关县| 梁平县| 纳雍县| 康乐县| 西华县| 泗洪县| 炉霍县| 逊克县| 洛扎县| 松溪县| 茶陵县| 金阳县| 专栏| 集贤县| 岳西县| 嘉鱼县| 吴忠市| 维西| 琼结县| 灵山县| 福清市| 南汇区| 灵石县| 当涂县| 安国市| 安岳县| 临邑县| 玛多县|