简体   繁体   English

SQL Server:合并同一表的两行

[英]SQL Server: Merge two rows of same table

I'm trying to merge the rows from a table in below manner.我正在尝试以以下方式合并表中的行。

The table contains logs about the Request, Response, RequestTime and ResponseTime made to an API.该表包含有关对 API 进行的请求、响应、请求时间和响应时间的日志。

Please find the attached image here.请在此处找到所附图片。

Both Request and Response columns in the desired output are both populated from Message column of base table.所需输出中的请求和响应列都从基表的消息列填充。

Similarly, the RequestTime and ResponseTime columns in the desired output are both populated from Date column of base table.同样,所需输出中的 RequestTime 和 ResponseTime 列都是从基表的 Date 列填充的。

I have tried the below code and it is getting me desired output but I don't think this is the right way to do it.我已经尝试了下面的代码,它得到了我想要的输出,但我认为这不是正确的方法。

ALTER PROCEDURE [dbo].[GetPackageRequestResponseDetails]
    @PACKAGEID VARCHAR(20)  
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @ApiLogDump TABLE
    (
        Date DATETIME,
        Thread VARCHAR(255),
        Logger VARCHAR(255),
        Message VARCHAR(4000)
    )

    INSERT INTO @ApiLogDump
    (
        Date,
        Thread,
        Logger,
        Message
    )
    SELECT
        Date,
        Thread,
        Logger,
        Message
    FROM APILog
    WHERE Logger LIKE '%GetPackageDetails%'
    AND Message LIKE '%'+@PACKAGEID+'%'

    DECLARE  @ApiLogMerge TABLE
    (
        Thread VARCHAR(255),
        Request VARCHAR(4000),
        Response VARCHAR(4000),
        RequestTime DATETIME,
        ResponseTime DATETIME
    )

    INSERT INTO @ApiLogMerge
    (   
        Thread,
        Request,
        Response,
        RequestTime,
        ResponseTime
    )
    SELECT 
        Thread,
        Message,
        Null,
        Date,
        Null
    FROM @ApiLogDump
    WHERE Message LIKE '%Request:'+@PACKAGEID+'%'


    UPDATE @ApiLogMerge
        SET Response = A.Message,
            ResponseTime = A.Date
    FROM @ApiLogMerge AP JOIN @ApiLogDump A
       ON AP.Thread = A.Thread
    WHERE Message LIKE '%Response:{"PackageID":"'+@PACKAGEID+'"%'

    SELECT * FROM @ApiLogMerge ORDER BY RequestTime DESC

END

Any help would be highly appreciated.任何帮助将不胜感激。

Try this below logic using GROUP BY and other conditions.使用 GROUP BY 和其他条件尝试以下逻辑。

SELECT Thread,
MAX(CASE WHEN LEFT(Message,7) = 'Request' THEN Message ELSE NULL END) Request,
MAX(CASE WHEN LEFT(Message,8) = 'Response' THEN Message ELSE NULL END) Response,
MAX(CASE WHEN LEFT(Message,7) = 'Request' THEN Date ELSE NULL END) RequestTime,
MAX(CASE WHEN LEFT(Message,8) = 'Response' THEN Date ELSE NULL END) ResponseTime
FROM BaseTable
GROUP BY Thread

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM