Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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 server SQL将多行转换为单行,但并不总是如此_Sql Server_Pivot_Union - Fatal编程技术网

Sql server SQL将多行转换为单行,但并不总是如此

Sql server SQL将多行转换为单行,但并不总是如此,sql-server,pivot,union,Sql Server,Pivot,Union,我有一个实时数据库,显示呼叫中心代理登录时的状态。一个代理可以作为语音代理或聊天代理或两者同时登录,每个登录都显示在单独的一行上 如果她两个都登录 AgentID | State |ReasonCode |LoginDur |StateDur |Domain -------------------------------------------------------------------- 1301 | NotReady |Lunch |

我有一个实时数据库,显示呼叫中心代理登录时的状态。一个代理可以作为语音代理或聊天代理或两者同时登录,每个登录都显示在单独的一行上

如果她两个都登录

 AgentID | State    |ReasonCode  |LoginDur  |StateDur       |Domain
 --------------------------------------------------------------------
   1301    | NotReady   |Lunch       |01:23:12  |00:23:21       |1
   1301    | Ready      |Undefined   |00:57:12  |00:00:12       |5
AgtID | V-State |V-ReCode |V-LogDur |V-StDur |C-State|C-RCode  |C-LogDur  |C-StDur |
-------------------------------------------------------------------------------------------
1301    |NotReady|Lunch    |01:23:12 |00:23:21|NULL   |NULL |NULL  |NULL

AgtID | V-State |V-ReCode |V-LogDur |V-StDur |C-State|C-RCode  |C-LogDur  |C-StDur |
-------------------------------------------------------------------------------------------
1301    |NotReady|Lunch    |01:23:12 |00:23:21|Ready  |Undefined|00:57:12  |00:00:12

AgtID | V-State |V-ReCode |V-LogDur |V-StDur |C-State|C-RCode  |C-LogDur  |C-StDur |
-------------------------------------------------------------------------------------------
1301    |NULL|NULL     |NULL |NULL  |Ready  |Undefined|00:57:12  |00:00:12
域1用于语音登录,5用于聊天登录,AgentID为公共分母。现在我想做的是将两者合并在一行中

 AgtID | V-State |V-ReCode |V-LogDur |V-StDur |C-State|C-RCode  |C-LogDur  |C-StDur |
-------------------------------------------------------------------------------------------
1301    |NotReady|Lunch    |01:23:12 |00:23:21|Ready  |Undefined|00:57:12  |00:00:12
如果代理同时以语音和聊天代理的身份登录,我可以使用下面的查询来实现这一点

    SELECT AgentID, V-State, V-StDur, V-LogDur, V-RCode, C-State, C-StDur, C-LogDur, C-RCode 
FROM(SELECT
ART1.AgentID AS AgentID,
ART1.AgtState AS V-State,
ART2.AgtState AS C-State,
ART1.StateDur AS V-StDur,
ART2.StateDur AS C-StDur,
ART1.LoginDur AS V-LogDur,
ART2.LoginDur AS C-LogDur,
ART1.ReasonCode AS V-RCode,
ART2.ReasonCode AS C-RCode
FROM AgentRealTime ART1, AgentRealTime ART2
WHERE ART1.AgentID = ART2.AgentID AND
ART1.DomainID = 1 AND ART2.DomainID=5
)
AS AGRT
但是,这仅在代理同时登录到这两个站点时才起作用。我还有两个案子要处理;如果代理仅作为语音代理或聊天代理登录。对于仅语音登录,我使用此查询

    SELECT
AgentID=ART.AgentID,
V-State=ART.AgtState,
C-State=NULL,
V-StDur=ART.StateDur,
C-StDur=NULL,
V-LogDur=ART.LoginDur,
C-LogDur=NULL,
V-RCode=ART.ReasonCode,
C-RCode=NULL
FROM AgentRealTime ART
WHERE ART.DomainID = 1
对于仅聊天登录,我使用此

    SELECT
AgentID=ART.AgentID,
V-State=NULL,
C-State=ART.AgtState,
V-StDur=NULL,
C-StDur=ART.StateDur,
V-LogDur=NULL,
C-LogDur=ART.LoginDur,
V-RCode=NULL,
C-RCode=ART.ReasonCode
FROM AgentRealTime ART
WHERE ART.DomainID = 5
我把这三个问题结合起来。若代理仅登录语音或聊天,则整个查询显示一行。但若代理同时登录这两行,则最终显示三行

 AgentID | State    |ReasonCode  |LoginDur  |StateDur       |Domain
 --------------------------------------------------------------------
   1301    | NotReady   |Lunch       |01:23:12  |00:23:21       |1
   1301    | Ready      |Undefined   |00:57:12  |00:00:12       |5
AgtID | V-State |V-ReCode |V-LogDur |V-StDur |C-State|C-RCode  |C-LogDur  |C-StDur |
-------------------------------------------------------------------------------------------
1301    |NotReady|Lunch    |01:23:12 |00:23:21|NULL   |NULL |NULL  |NULL

AgtID | V-State |V-ReCode |V-LogDur |V-StDur |C-State|C-RCode  |C-LogDur  |C-StDur |
-------------------------------------------------------------------------------------------
1301    |NotReady|Lunch    |01:23:12 |00:23:21|Ready  |Undefined|00:57:12  |00:00:12

AgtID | V-State |V-ReCode |V-LogDur |V-StDur |C-State|C-RCode  |C-LogDur  |C-StDur |
-------------------------------------------------------------------------------------------
1301    |NULL|NULL     |NULL |NULL  |Ready  |Undefined|00:57:12  |00:00:12

如果代理同时登录语音和聊天,如何将这三行相加为一行?或者您可以为该场景推荐的任何其他方法?

有几种方法可以做到这一点,我将主要用伪代码进行解释,因为您似乎知道自己在做什么

选项1:在后两个查询中,您可以添加和不存在/不存在

我稍微重写了where子句以使用内部连接

问题2

选择

其中ART.DomainID=5

而阿特·阿根蒂不在

选择ART1.AgentID

来自AgentRealTime ART1

内部连接代理在ART1.AgentID=ART2.AgentID上的超时ART2

其中ART1.DomainID=1

和ART2.DomainID=5

在查询3中具有相同的条件

选项2:在临时表中插入值以进行第一次查询。然后,在每个附加查询中检查AgentID是否不存在于表中。你可以用几种方法,我更喜欢左键连接

查询1->进入可诱惑的

查询2-> 选择

来自代理时间艺术

ART.agentID=t.agentID上的左连接可诱惑t

其中ART.DomainID=1

而t.agentID是空的

就我个人而言,我更喜欢临时表路由,因为您可以轻松地增强报表,并且一堆子查询和联合在一段时间后会变得混乱。此外,您还可以使用代码来提高效率


希望这有帮助,我第一次尝试回答一篇帖子。

您只需要完全外部连接:

SELECT AgentID, V-State, V-StDur, V-LogDur, V-RCode, C-State, C-StDur, C-LogDur, C-RCode 
FROM(SELECT
COALEASE(ART1.AgentID,ART2.AgentID) AS AgentID,
ART1.AgtState AS V-State,
ART2.AgtState AS C-State,
ART1.StateDur AS V-StDur,
ART2.StateDur AS C-StDur,
ART1.LoginDur AS V-LogDur,
ART2.LoginDur AS C-LogDur,
ART1.ReasonCode AS V-RCode,
ART2.ReasonCode AS C-RCode
FROM AgentRealTime ART1 
FULL OUTER JOIN AgentRealTime ART2
ON ART1.AgentID = ART2.AgentID AND
WHERE ART1.DomainID = 1 AND ART2.DomainID=5 
)
AS AGRT
AgentId需要使用coalease