Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从同一行上的内部联接差异获取结果_Sql_Sql Server 2012 - Fatal编程技术网

Sql 从同一行上的内部联接差异获取结果

Sql 从同一行上的内部联接差异获取结果,sql,sql-server-2012,Sql,Sql Server 2012,当前sql正在返回一个结果集,如下所示 WORKFLOWID UNMATCHEDVALUE MATCHEDADDRESS EXCEPTIONREASON 1001 UNIQUE ADDRESS1 (null) 1001 UNIQUE ADDRESS2 Some Value 我想要的是这样的结果 WORKFLOWID UNMATCHEDVALUE MATCHEDADDRESS EXCEPTIONRE

当前sql正在返回一个结果集,如下所示

WORKFLOWID  UNMATCHEDVALUE  MATCHEDADDRESS  EXCEPTIONREASON
1001        UNIQUE          ADDRESS1        (null)
1001        UNIQUE          ADDRESS2        Some Value
我想要的是这样的结果

WORKFLOWID UNMATCHEDVALUE MATCHEDADDRESS EXCEPTIONREASON MATCHEDADDRESS2    EXCEPTIONREASON2
 1001      UNIQUE         ADDRESS1       (null)          ADDRESS2           Some Value
因此,“variant”列与address和Exception Reason匹配,其他列对于每个记录都是相同的。请注意,对于每个工作流id,将始终返回2行

我还创建了一个小提琴来显示模式

试试这个:

;WITH CTE AS
(
    SELECT  ws.id as WorkflowStepId,
            ws.workflow_id as WorkflowId, 
            sg.unmatchValue as UnmatchedValue,
            geo_address as MatchedAddress, 
            ws.exception_Value as ExceptionReason,
            ROW_NUMBER() OVER(PARTITION BY ws.workflow_id ORDER BY ws.id) as RN
    FROM workflow_step as ws 
    INNER JOIN workflow as gw 
        ON ws.workflow_id = gw.id
    INNER JOIN super_group as sg 
        ON gw.super_group_id = sg.id
    INNER JOIN alias on 
        ws.id = alias.workflow_step_id
)
SELECT  WorkflowId,
        UnmatchedValue,
        MIN(CASE WHEN RN = 1 THEN MatchedAddress END) MatchedAddress,
        MIN(CASE WHEN RN = 1 THEN ExceptionReason END) ExceptionReason,
        MIN(CASE WHEN RN = 2 THEN MatchedAddress END) MatchedAddress2,
        MIN(CASE WHEN RN = 2 THEN ExceptionReason END) ExceptionReason2
FROM CTE
GROUP BY WorkflowId,
         UnmatchedValue
ORDER BY workflowId
SELECT ws.workflow_id as WorkflowId, sg.unmatchValue as UnmatchedValue,
    MAX(CASE WHEN ws.id = 1 THEN geo_address END) as MatchedAddress1,
    MAX(CASE WHEN ws.id = 2 THEN geo_address END) as MatchedAddress2,
    MAX(CASE WHEN ws.id = 1 THEN ws.exception_Value END) as ExceptionReason1,
    MAX(CASE WHEN ws.id = 2 THEN ws.exception_Value END) as ExceptionReason2 

    FROM workflow_step as ws 
 INNER JOIN workflow as gw on ws.workflow_id = gw.id
    INNER JOIN super_group as sg on gw.super_group_id = sg.id
    inner JOIN alias on ws.id = alias.workflow_step_id
    GROUP BY  ws.workflow_id, sg.unmatchValue
修改后的sqlfiddle

结果是:

╔════════════╦════════════════╦════════════════╦═════════════════╦═════════════════╦══════════════════╗
║ WORKFLOWID ║ UNMATCHEDVALUE ║ MATCHEDADDRESS ║ EXCEPTIONREASON ║ MATCHEDADDRESS2 ║ EXCEPTIONREASON2 ║
╠════════════╬════════════════╬════════════════╬═════════════════╬═════════════════╬══════════════════╣
║       1001 ║ UNIQUE         ║ ADDRESS1       ║ (null)          ║ ADDRESS2        ║ Some Value       ║
╚════════════╩════════════════╩════════════════╩═════════════════╩═════════════════╩══════════════════╝
试试这个:

;WITH CTE AS
(
    SELECT  ws.id as WorkflowStepId,
            ws.workflow_id as WorkflowId, 
            sg.unmatchValue as UnmatchedValue,
            geo_address as MatchedAddress, 
            ws.exception_Value as ExceptionReason,
            ROW_NUMBER() OVER(PARTITION BY ws.workflow_id ORDER BY ws.id) as RN
    FROM workflow_step as ws 
    INNER JOIN workflow as gw 
        ON ws.workflow_id = gw.id
    INNER JOIN super_group as sg 
        ON gw.super_group_id = sg.id
    INNER JOIN alias on 
        ws.id = alias.workflow_step_id
)
SELECT  WorkflowId,
        UnmatchedValue,
        MIN(CASE WHEN RN = 1 THEN MatchedAddress END) MatchedAddress,
        MIN(CASE WHEN RN = 1 THEN ExceptionReason END) ExceptionReason,
        MIN(CASE WHEN RN = 2 THEN MatchedAddress END) MatchedAddress2,
        MIN(CASE WHEN RN = 2 THEN ExceptionReason END) ExceptionReason2
FROM CTE
GROUP BY WorkflowId,
         UnmatchedValue
ORDER BY workflowId
SELECT ws.workflow_id as WorkflowId, sg.unmatchValue as UnmatchedValue,
    MAX(CASE WHEN ws.id = 1 THEN geo_address END) as MatchedAddress1,
    MAX(CASE WHEN ws.id = 2 THEN geo_address END) as MatchedAddress2,
    MAX(CASE WHEN ws.id = 1 THEN ws.exception_Value END) as ExceptionReason1,
    MAX(CASE WHEN ws.id = 2 THEN ws.exception_Value END) as ExceptionReason2 

    FROM workflow_step as ws 
 INNER JOIN workflow as gw on ws.workflow_id = gw.id
    INNER JOIN super_group as sg on gw.super_group_id = sg.id
    inner JOIN alias on ws.id = alias.workflow_step_id
    GROUP BY  ws.workflow_id, sg.unmatchValue
修改后的sqlfiddle

结果是:

╔════════════╦════════════════╦════════════════╦═════════════════╦═════════════════╦══════════════════╗
║ WORKFLOWID ║ UNMATCHEDVALUE ║ MATCHEDADDRESS ║ EXCEPTIONREASON ║ MATCHEDADDRESS2 ║ EXCEPTIONREASON2 ║
╠════════════╬════════════════╬════════════════╬═════════════════╬═════════════════╬══════════════════╣
║       1001 ║ UNIQUE         ║ ADDRESS1       ║ (null)          ║ ADDRESS2        ║ Some Value       ║
╚════════════╩════════════════╩════════════════╩═════════════════╩═════════════════╩══════════════════╝
试试这个:

;WITH CTE AS
(
    SELECT  ws.id as WorkflowStepId,
            ws.workflow_id as WorkflowId, 
            sg.unmatchValue as UnmatchedValue,
            geo_address as MatchedAddress, 
            ws.exception_Value as ExceptionReason,
            ROW_NUMBER() OVER(PARTITION BY ws.workflow_id ORDER BY ws.id) as RN
    FROM workflow_step as ws 
    INNER JOIN workflow as gw 
        ON ws.workflow_id = gw.id
    INNER JOIN super_group as sg 
        ON gw.super_group_id = sg.id
    INNER JOIN alias on 
        ws.id = alias.workflow_step_id
)
SELECT  WorkflowId,
        UnmatchedValue,
        MIN(CASE WHEN RN = 1 THEN MatchedAddress END) MatchedAddress,
        MIN(CASE WHEN RN = 1 THEN ExceptionReason END) ExceptionReason,
        MIN(CASE WHEN RN = 2 THEN MatchedAddress END) MatchedAddress2,
        MIN(CASE WHEN RN = 2 THEN ExceptionReason END) ExceptionReason2
FROM CTE
GROUP BY WorkflowId,
         UnmatchedValue
ORDER BY workflowId
SELECT ws.workflow_id as WorkflowId, sg.unmatchValue as UnmatchedValue,
    MAX(CASE WHEN ws.id = 1 THEN geo_address END) as MatchedAddress1,
    MAX(CASE WHEN ws.id = 2 THEN geo_address END) as MatchedAddress2,
    MAX(CASE WHEN ws.id = 1 THEN ws.exception_Value END) as ExceptionReason1,
    MAX(CASE WHEN ws.id = 2 THEN ws.exception_Value END) as ExceptionReason2 

    FROM workflow_step as ws 
 INNER JOIN workflow as gw on ws.workflow_id = gw.id
    INNER JOIN super_group as sg on gw.super_group_id = sg.id
    inner JOIN alias on ws.id = alias.workflow_step_id
    GROUP BY  ws.workflow_id, sg.unmatchValue
试试这个:

;WITH CTE AS
(
    SELECT  ws.id as WorkflowStepId,
            ws.workflow_id as WorkflowId, 
            sg.unmatchValue as UnmatchedValue,
            geo_address as MatchedAddress, 
            ws.exception_Value as ExceptionReason,
            ROW_NUMBER() OVER(PARTITION BY ws.workflow_id ORDER BY ws.id) as RN
    FROM workflow_step as ws 
    INNER JOIN workflow as gw 
        ON ws.workflow_id = gw.id
    INNER JOIN super_group as sg 
        ON gw.super_group_id = sg.id
    INNER JOIN alias on 
        ws.id = alias.workflow_step_id
)
SELECT  WorkflowId,
        UnmatchedValue,
        MIN(CASE WHEN RN = 1 THEN MatchedAddress END) MatchedAddress,
        MIN(CASE WHEN RN = 1 THEN ExceptionReason END) ExceptionReason,
        MIN(CASE WHEN RN = 2 THEN MatchedAddress END) MatchedAddress2,
        MIN(CASE WHEN RN = 2 THEN ExceptionReason END) ExceptionReason2
FROM CTE
GROUP BY WorkflowId,
         UnmatchedValue
ORDER BY workflowId
SELECT ws.workflow_id as WorkflowId, sg.unmatchValue as UnmatchedValue,
    MAX(CASE WHEN ws.id = 1 THEN geo_address END) as MatchedAddress1,
    MAX(CASE WHEN ws.id = 2 THEN geo_address END) as MatchedAddress2,
    MAX(CASE WHEN ws.id = 1 THEN ws.exception_Value END) as ExceptionReason1,
    MAX(CASE WHEN ws.id = 2 THEN ws.exception_Value END) as ExceptionReason2 

    FROM workflow_step as ws 
 INNER JOIN workflow as gw on ws.workflow_id = gw.id
    INNER JOIN super_group as sg on gw.super_group_id = sg.id
    inner JOIN alias on ws.id = alias.workflow_step_id
    GROUP BY  ws.workflow_id, sg.unmatchValue

由于我无法发表评论,我只想指出,拉马克给出的答案使用了一个。这些通常是解决sql中递归问题的最佳选择。

因为我不能评论,所以我只想指出,Lamak给出的答案使用了一个。这些通常是解决sql中递归问题的最佳选择。

这假设您只有两种地址类型。如果您有更多信息,我建议您创建一个透视表

    select a.*, MATCHEDADDRESS2,EXCEPTIONREASON2
    from
    (Select WORKFLOWID,UNIQUEVALUE,MATCHEDADDRESS,EXCEPTIONREASON
     from "Your Table"
     where MATCHEDADDRESS='ADDRESS1') a

    join

    (Select WORKFLOWID,UNIQUEVALUE,MATCHEDADDRESS as MATCHEDADDRESS2,EXCEPTIONREASON as   XCEPTIONREASON2
     from "Your Table"
     where MATCHEDADDRESS='ADDRESS2') b
          on a.WORKFLOWID=b.WORKFLOWID
               and a.UNMATCHEDVALUE = b.UNMATCHEDVALUE

这假设您只有两种地址类型。如果您有更多信息,我建议您创建一个透视表

    select a.*, MATCHEDADDRESS2,EXCEPTIONREASON2
    from
    (Select WORKFLOWID,UNIQUEVALUE,MATCHEDADDRESS,EXCEPTIONREASON
     from "Your Table"
     where MATCHEDADDRESS='ADDRESS1') a

    join

    (Select WORKFLOWID,UNIQUEVALUE,MATCHEDADDRESS as MATCHEDADDRESS2,EXCEPTIONREASON as   XCEPTIONREASON2
     from "Your Table"
     where MATCHEDADDRESS='ADDRESS2') b
          on a.WORKFLOWID=b.WORKFLOWID
               and a.UNMATCHEDVALUE = b.UNMATCHEDVALUE

是否只有2场比赛,或者可以达到N级?如果只有2,那么案例逻辑应该在这里工作。这会有一些问题,因为您的输出模式依赖于输入数据(即,有多少行具有相同的工作流id)。任何解决方案都会看起来非常粗糙。@xQbert对于每个工作流id,它最多有两行,我想将这两行压缩成一行。是否只有两个匹配项,或者它可以达到N个级别?如果只有2,那么案例逻辑应该在这里工作。这会有一些问题,因为您的输出模式依赖于输入数据(即,有多少行具有相同的工作流id)。任何解决方案看起来都会非常粗糙。@xQbert对于每个工作流id,它最多有两行,我想将这两行压缩成一行