Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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个值的查询表_Sql_Sql Server - Fatal编程技术网

Sql 具有多个可能值但仅返回1个值的查询表

Sql 具有多个可能值但仅返回1个值的查询表,sql,sql-server,Sql,Sql Server,我有一个表,它根据ID保存了多个值,表中有标志来标识值的含义。也不能保证每个标志都有记录。这是一个地址字段,因此其中有家庭、业务和其他方面的标志。我需要首先查询表并获取家庭地址(如果存在),如果不存在,则获取业务。我不知道该怎么做。这也是我正在使用的SQL Server 2016。使用以下分析功能: Select * from (Select t.*, Row_number() over (partition by id order

我有一个表,它根据ID保存了多个值,表中有标志来标识值的含义。也不能保证每个标志都有记录。这是一个地址字段,因此其中有家庭、业务和其他方面的标志。我需要首先查询表并获取家庭地址(如果存在),如果不存在,则获取业务。我不知道该怎么做。这也是我正在使用的SQL Server 2016。

使用以下分析功能:

Select * from
(Select t.*,
       Row_number() 
        over (partition by id 
              order by case when flag = 'home' then 1 
                            when flag = 'business' then 2
                            else 3 end) as rn
  From t) t
Where rn = 1

使用以下分析功能:

Select * from
(Select t.*,
       Row_number() 
        over (partition by id 
              order by case when flag = 'home' then 1 
                            when flag = 'business' then 2
                            else 3 end) as rn
  From t) t
Where rn = 1

尝试在查询中使用CASE-WHEN语句。比如:

选择
案例
当Home不为空时,则Home
当Home为NULL且Business不为NULL时,则Business
ELSE NULL

结束为固定地址

在查询中尝试使用CASE-WHEN语句。比如:

选择
案例
当Home不为空时,则Home
当Home为NULL且Business不为NULL时,则Business
ELSE NULL

结束为固定地址

您可以使用
行编号
按客户/个人/实体标识符对数据进行分区,但根据您的标志优先显示家庭、业务和其他

SELECT *
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY CustomerId
    ORDER BY IsHome DESC, IsBusiness DESC, IsOther DESC) AS RowNum FROM @Address) T
WHERE T.RowNum = 1
这适用于以下示例数据:

DECLARE @Address TABLE (
    ID INT, -- ID of the address
    CustomerId INT, -- Whichever field identifies the owner of multiple addresses
    IsHome BIT, -- Flag for home
    IsBusiness BIT, -- Flag for business
    IsOther BIT -- Flag for other
)
INSERT @Address VALUES (1,1,1,0,0), (1,1,0,1,0), (1,1,0,0,1)

您可以使用
行编号
按客户/个人/实体标识符对数据进行分区,但根据您的标志进行优先级排序,以显示家庭、业务和其他

SELECT *
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY CustomerId
    ORDER BY IsHome DESC, IsBusiness DESC, IsOther DESC) AS RowNum FROM @Address) T
WHERE T.RowNum = 1
这适用于以下示例数据:

DECLARE @Address TABLE (
    ID INT, -- ID of the address
    CustomerId INT, -- Whichever field identifies the owner of multiple addresses
    IsHome BIT, -- Flag for home
    IsBusiness BIT, -- Flag for business
    IsOther BIT -- Flag for other
)
INSERT @Address VALUES (1,1,1,0,0), (1,1,0,1,0), (1,1,0,0,1)

请提供样本数据和期望的结果。对不起,你是对的,我应该给出一些例子。这里是我正在看的:表格:地址ID标志完整地址123家123任何街道,任何城镇,ST 12345 123商业455其他街道,纽敦,ST 12345 455家4558另一条街,任何城镇,ST 12345结果需要ID标志完整地址123家123任何街道,任何城镇,ST 12345 455 Home 4558另一条街,SomeTown,ST 12345请提供示例数据和所需结果。对不起,你说得对,我应该给出一些示例。这里是我正在看的:表格:地址ID标志完整地址123家123任何街道,任何城镇,ST 12345 123商业455其他街道,纽敦,ST 12345 455家4558另一条街,任何城镇,ST 12345结果需要ID标志完整地址123家123任何街道,任何城镇,ST 12345 455 Home 4558 ST 12345 SomeTown另一条街