Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/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 按1个条件对2个条件对账户进行分组_Sql_Sql Server - Fatal编程技术网

Sql 按1个条件对2个条件对账户进行分组

Sql 按1个条件对2个条件对账户进行分组,sql,sql-server,Sql,Sql Server,我正在尝试获取仅“发送”或仅“发送和接收”的pat_id计数 这是我目前的疑问 select pat_id, (case when addr_msg_actn_c in(1) then 'Sent' else convert(varchar(10),'Received') end) [Status] from pat_addr_verif where pat_id in ('Z1000354','Z1000363','Z1000392','Z1000394') group by pat_id

我正在尝试获取仅“发送”或仅“发送和接收”的
pat_id
计数

这是我目前的疑问

select pat_id,
(case when addr_msg_actn_c in(1) then 'Sent' else convert(varchar(10),'Received') end) [Status]
from pat_addr_verif
where   pat_id in ('Z1000354','Z1000363','Z1000392','Z1000394')
group by pat_id, addr_msg_actn_c
order by pat_id
它生成了这个输出

但是,我希望简化输出,以如下方式显示

create table SentReceive
(
Pat_ID nvarchar(8),
SentOnly nvarchar(8)
)

insert SentReceive
values
('Z1000354','Sent'),
('Z1000363','Sent'),
('Z1000363','Received'),
('Z1000392','Sent'),
('Z1000394','Sent'),
('Z1000394','Received')

select distinct a.Pat_ID,
    case
        when b.SentOnly is not null then
            case a.SentOnly
                when 'Received' then b.SentOnly + ' and ' + a.SentOnly
                else a.SentOnly + ' and ' + b.SentOnly
            end
        else a.SentOnly
    end as Status
from SentReceive a
    left join SentReceive b on a.Pat_ID = b.Pat_ID and a.SentOnly <> b.SentOnly

创建表格
(
Pat_ID nvarchar(8),
SentOnly nvarchar(8)
)
插入SentReceive
价值观
('Z1000354','Sent'),
('Z1000363','Sent'),
('Z1000363','Received'),
('Z1000392','Sent'),
('Z1000394','Sent'),
('Z1000394','Received')
选择不同的a.Pat_ID,
案例
当b.SentOnly不为空时
仅案例a
当“收到”时,则b.SentOnly+“和”+a.SentOnly
否则a.SentOnly+'和'+b.SentOnly
结束
除此之外,a
以身份结束
从Senta收到
在a.Pat_ID=b.Pat_ID和a.SentOnly上左连接SentReceive b.SentOnly

我用你提供的可用数据做了一个快速测试。如果你的数据集中还有其他的变化,那么你需要考虑到这一点,它可能会改变,也可能不会改变我的想法。祝你好运

这里有一个小小的概念证明。可以对值的总和生成case语句,以选择所需的文本字符串

   CREATE TABLE #SentReceive (
    Pat_ID NVARCHAR(8)
    ,[status] TINYINT
    )

INSERT INTO #SentReceive
VALUES (    'Z1000354'  ,1  )
    ,(    'Z1000354'  ,1  )
    ,(  'Z1000363'  ,1  )
    ,(  'Z1000363'  ,2  )
    ,(  'Z1000392'  ,2  )
    ,(  'Z1000394'  ,1  )
    ,(  'Z1000394'  ,2  )

SELECT pat_id
    ,sentstatus = CASE sum(distinct [status])
        WHEN 1
            THEN 'Sent'
        WHEN 2
            THEN 'Received'
        WHEN 3
            THEN 'Sent and Received'
        END
FROM #SentReceive
GROUP BY pat_id
ORDER BY pat_id

以下是我的想法:

;with cte as
(
select 1 as _order, 'Z1000354' as pat_id, 'Sent' as SentOnly
union select 2, 'Z1000363', 'Sent'
union select 3, 'Z1000363', 'Received'
union select 4, 'Z1000392', 'Sent'
union select 5, 'Z1000393', 'Received'
union select 5, 'Z1000394', 'Sent'
union select 6, 'Z1000394', 'Received'
) 
select pat_id, replace(_Status,',',' and') as _Status
from(
select distinct pat_id, 
STUFF((Select ', '+SentOnly  
from cte T2
where T1.pat_id=T2.pat_id
FOR XML PATH('')),1,1,'') as _Status from cte T1
) a
where _Status in (' Sent', ' Sent, Received')

最终查询,请从以上海报中获得帮助:

    select distinct a.pat_id,
    case when b.ADDR_MSG_ACTN_C is not null 
         then 'Sent and Received' else 'Sent Only' end as Status
from pat_addr_verif a
left join pat_addr_verif b on a.pat_id = b.pat_id and 
          a.ADDR_MSG_ACTN_C <> b.ADDR_MSG_ACTN_C
where   a.pat_id in ('Z1000354','Z1000363','Z1000392','Z1000394') 
选择不同的a.pat\u id,
b.ADDR\u MSG\u ACTN\u C不为空时的情况
然后“已发送和已接收”或“仅发送”结束为状态
来自pat_addr_verif a
左连接a.pat_id=b.pat_id上的pat_addr_verif b和
a、 ADDR_MSG_ACTN_C b.ADDR_MSG_ACTN_C
其中a.pat_id位于('Z1000354','Z1000363','Z1000392','Z1000394')

你的问题是什么?您的问题是什么?对不起,如何更新查询以将第一张图片转换为第二张?注意,在第一张图片中,帐户Z1000354仅为“已发送”,而帐户Z1000363同时为“已发送”和“已接收”。我想对行进行分组,以便帐户Z1000354告诉我它仅为“已发送”,而帐户Z1000363指示它为“已发送和已接收”。这可能吗?嘿,Gabe,您有什么版本的sql server?是否有“received”的特定值?或者只是收到了非1(已发送)的内容?嘿@zip我正在使用SQL Server 2014,版本12.0.2000.8。Jeremy,这非常有用。不过,唯一的问题是(这是我没有提及的过错)在这个数据集中,一个帐户可能有多达6个已发送帐户,而没有收到帐户。简单,最容易理解。非常感谢。Doua这个框架让我达到了目的,只是做了一些小小的调整!最后一个查询:选择不同的a.pat_id,如果b.ADDR_MSG_ACTN_C不为空,则“发送和接收”else“仅发送”结束为状态,从pat_ADDR_verif a左加入pat_ADDR_verif b on a.pat_id=b.pat_id和a.ADDR_MSG_ACTN_C b.ADDR_MSG_ACTN_C其中a.pat_id in('Z1000354'、'Z1000363'、'Z1000392'、'Z1000394'),我很高兴这很有帮助;查看下面的最终查询,您的原始问题中还缺少其他信息。尽管如此,这是关于学习和适应摆在你面前的事情,这是你做得很好的事情(在这种情况下)。感谢你的时间,你的反应很好。而且你是新来的!很快,我相信你会得到很多荣誉积分:)谢谢@zip!还有另一种解决方法。