sqlserver 将多行数据查询合并为一条数据
有这样一个需求:表T_FUN_TASK为任务表,有字段(TASKID,TASKNAME),表T_FUN_LOGBOOK为日志表,有字段(LOGID,TASKID,LOGDATE),一个任务可持续多天,每天会记录一条日志。在查询表T_FUN_TASK时,需将任务表中的 LOGDATE 查询出来作为一列 LOGDATES显示。
有这样一个需求:表T_FUN_TASK为任务表,有字段(TASKID,TASKNAME),表T_FUN_LOGBOOK为日志表,有字段(LOGID,TASKID,LOGDATE),一个任务可持续多天,每天会记录一条日志。在查询表T_FUN_TASK时,需将任务表中的 LOGDATE 查询出来作为一列 LOGDATES显示。
T_FUN_TASK
T_FUN_LOGBOOK
查询结果
此结果查询方法可以用存储过程轻松实现,这里我要介绍的是sqlserver FOR XML PATH语句的应用,在SQL Server中利用 FOR XML PATH 语句能够把查询的数据生成XML数据
且合并为一条数据,看以下示例:
<span>SELECT</span> LOGDATE <span>FROM</span> T_FUN_LOGBOOK <span>WHERE</span> TASKID<span>=</span><span>231</span> <span>FOR</span> XML PATH
结果为:
首先,将日期格式转化为需要的格式:
<span>SELECT</span> <span>CONVERT</span>(<span>VARCHAR</span>(<span>100</span>), LOGDATE, <span>111</span>) <span>FROM</span> T_FUN_LOGBOOK <span>WHERE</span> TASKID<span>=</span><span>231</span> <span>FOR</span> XML PATH
结果变为:
<span>SELECT</span> <span>CONVERT</span>(<span>VARCHAR</span>(<span>100</span>), LOGDATE, <span>111</span>) <span>FROM</span> T_FUN_LOGBOOK <span>WHERE</span> TASKID<span>=</span><span>231</span> <span>FOR</span> XML PATH('')
现在两条结果之间很难区分,需要用下划线将其分隔开来,方法是在CONVERT函数前面加上一个下划线:
<span>SELECT</span> <span>'</span><span>_</span><span>'</span><span>+</span><span>CONVERT</span>(<span>VARCHAR</span>(<span>100</span>), LOGDATE, <span>111</span>) <span>FROM</span> T_FUN_LOGBOOK <span>WHERE</span> TASKID<span>=</span><span>231</span> <span>FOR</span> XML PATH(<span>''</span>)
结果:_2014/01/06_2014/01/07。
在分析了FOR XML PATH语句之后,就来将这个查询结果添加到对T_FUN_TASk的查询结果中去。我的思路是先构建一个子查询,然后查询TASK表时LEFT JOIN这个子查询:
<span>SELECT</span> T1.TASKID,<span>'</span><span>TASKNAME</span><span>'</span> <span>AS</span> TASKNAME,T2.LOGDATES <span>FROM</span><span> T_FUN_TASK T1 </span><span>LEFT</span> <span>JOIN</span> (<span>SELECT</span><span> TASKID, LOGDATES</span><span>=</span>(<span>SELECT</span> <span>'</span><span>_</span><span>'</span><span>+</span><span>CONVERT</span>(<span>VARCHAR</span>(<span>100</span>), LOGDATE, <span>111</span>) <span>FROM</span> T_FUN_LOGBOOK <span>WHERE</span> TASKID<span>=</span>T1.TASKID <span>FOR</span> XML PATH(<span>''</span>)) <span>FROM</span><span> T_FUN_LOGBOOK T1 </span><span>GROUP</span> <span>BY</span> TASKID) T2 <span>ON</span> T2.TASKID<span>=</span><span>T1.TASKID </span><span>ORDER</span> <span>BY</span> T1.TASKID <span>ASC</span>
运行以上SQL后得到的结果为:
发现LOGDATES值的第一个下划线应该去掉,于是修改SQL,应用 STUFF函数去掉第一个下划线:
<span>SELECT</span> T1.TASKID,<span>'</span><span>TASKNAME</span><span>'</span> <span>AS</span> TASKNAME,T2.LOGDATES <span>FROM</span><span> T_FUN_TASK T1 </span><span>LEFT</span> <span>JOIN</span> (<span>SELECT</span><span> TASKID, LOGDATES</span><span>=</span><span>STUFF</span>((<span>SELECT</span> <span>'</span><span>_</span><span>'</span><span>+</span><span>CONVERT</span>(<span>VARCHAR</span>(<span>100</span>), LOGDATE, <span>111</span>) <span>FROM</span> T_FUN_LOGBOOK <span>WHERE</span> TASKID<span>=</span>T1.TASKID <span>FOR</span> XML PATH(<span>''</span>)),<span>1</span>,<span>1</span>,<span>''</span>) <span>FROM</span><span> T_FUN_LOGBOOK T1 </span><span>GROUP</span> <span>BY</span><span> TASKID) T2 </span><span>ON</span> T2.TASKID<span>=</span><span>T1.TASKID </span><span>ORDER</span> <span>BY</span> T1.TASKID <span>ASC</span>
将结果转化为JSON 返回给前端之后,JS按照下划线分隔这个字段的值,即可以得到一个任务下面日志的填写情况。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

SQL Server データベースに既に存在する同じ名前のオブジェクトについては、次の手順を実行する必要があります。 オブジェクトの種類 (テーブル、ビュー、ストアド プロシージャ) を確認します。 IF NOT EXISTS を使用すると、オブジェクトが空の場合に作成をスキップできます。オブジェクトにデータがある場合は、別の名前を使用するか、構造を変更してください。既存のオブジェクトを削除するには、DROP を使用します (注意してください。バックアップを推奨します)。スキーマの変更をチェックして、削除または名前変更されたオブジェクトへの参照がないことを確認します。

インポート手順は次のとおりです。 MDF ファイルを SQL Server のデータ ディレクトリ (通常は C:\Program Files\Microsoft SQL Server\MSSQL\DATA) にコピーします。 SQL Server Management Studio (SSMS) でデータベースを開き、[アタッチ] を選択します。 「追加」ボタンをクリックして、MDF ファイルを選択します。データベース名を確認し、「OK」ボタンをクリックします。

SQL Server サービスの開始に失敗した場合の解決手順は次のとおりです。 エラー ログを確認して、根本原因を特定します。サービス アカウントにサービスを開始する権限があることを確認してください。依存関係サービスが実行されているかどうかを確認します。ウイルス対策ソフトウェアを無効にします。 SQL Server のインストールを修復します。修復が機能しない場合は、SQL Server を再インストールします。

SQL Server のポート番号を表示するには: SSMS を開いてサーバーに接続します。オブジェクト エクスプローラーでサーバー名を見つけ、右クリックして [プロパティ] を選択します。 「接続」タブで、「TCP ポート」フィールドを表示します。

SQL Server データベース ファイルは、通常、次のデフォルトの場所に保存されます。 Windows: C:\Program Files\Microsoft SQL Server\MSSQL\DATALinux: /var/opt/mssql/data データベース ファイルの場所は、データベース ファイル パスを変更することでカスタマイズできます。設定。

SQL Server データベースを誤って削除した場合は、次の手順を実行して回復できます: データベース アクティビティの停止、ログ ファイルのバックアップ、データベース ログの確認、回復オプション: バックアップからの復元、トランザクション ログからの復元、DBCC CHECKDB の使用、3 番目の使用パーティーツール。データ損失を防ぐために、データベースを定期的にバックアップし、トランザクション ログを有効にしてください。

iPhone のモバイル データ接続に遅延や遅い問題が発生していませんか?通常、携帯電話の携帯インターネットの強度は、地域、携帯ネットワークの種類、ローミングの種類などのいくつかの要因によって異なります。より高速で信頼性の高いセルラー インターネット接続を実現するためにできることがいくつかあります。解決策 1 – iPhone を強制的に再起動する 場合によっては、デバイスを強制的に再起動すると、携帯電話接続を含む多くの機能がリセットされるだけです。ステップ 1 – 音量を上げるキーを 1 回押して放します。次に、音量小キーを押して、もう一度放します。ステップ 2 – プロセスの次の部分は、右側のボタンを押し続けることです。 iPhone の再起動が完了するまで待ちます。セルラーデータを有効にし、ネットワーク速度を確認します。もう一度確認してください 修正 2 – データ モードを変更する 5G はより優れたネットワーク速度を提供しますが、信号が弱い場合はより適切に機能します

SQL Server のインストールが失敗した場合は、次の手順に従ってクリーンアップできます。 SQL Server をアンインストールする レジストリ キーを削除する ファイルとフォルダーを削除する コンピューターを再起動する
