我有一张PetsTable号桌:

Id Type key value
1 "Cat" 10 5
1 "Cat" 9 2
2 "dog" 10 5
1 "Cat" 8 4
1 "Cat" 6 3
2 "dog" 8 4
2 "dog" 6 3
3 "Cat" 13 5
3 "Cat" 10 0
3 "Cat" 8 0

如何在满足以下条件的情况下将此数据从PetsTable插入到新表MyPets中:

  • 按ID分组
  • 只有在组中存在时才 Select 行(key=10和value=5)和(key=8和value=4)和(key=6和value=3)
  • 如果存在密钥=9,则标记hasFee=1,否则标记hasFee=0

最终表格应如下所示:

Id Type hasFee
1 "Cat" 1
2 "dog" 0

推荐答案

一种方法是使用窗口函数来判断您的条件,然后可以使用CTE将其作为条件apply.

这将创建您想要的数据,然后将其插入到您 Select 的表中是很容易的.

create table Test (Id int, [Type] varchar(3), [Key] int, [Value] int);

insert into Test (Id, [Type], [Key], [Value])
values
(1, 'Cat', 10, 5),
(1, 'Cat', 9,  2),
(2, 'Dog', 10, 5),
(1, 'Cat', 8,  4),
(1, 'Cat', 6,  3),
(2, 'Dog', 8,  4),
(2, 'Dog', 6,  3),
(3, 'Cat', 13, 5),
(3, 'Cat', 10, 0),
(3, 'Cat', 8,  0);

with cte as (
  select *
    , sum(case when [Key] = 10 and [Value] = 5 then 1 else 0 end) over (partition by Id) Cond1
    , sum(case when [Key] = 8 and [Value] = 4 then 1 else 0 end) over (partition by Id) Cond2
    , sum(case when [Key] = 6 and [Value] = 3 then 1 else 0 end) over (partition by Id) Cond3
    , sum(case when [Key] = 9 then 1 else 0 end) over (partition by Id) HasFee
  from Test
)
select Id, [Type], HasFee
from cte
where Cond1 = 1 and Cond2 = 1 and Cond3 = 1
group by Id, [Type], HasFee;

返回:

Id Type HasFee
1 Cat 1
2 Dog 0

注意:如果您以这种格式(DDL+DML)提供样本数据,人们将更容易获得帮助.

db<>fiddle

Sql相关问答推荐

GROUP BY与多个嵌套查询T—SQL

如何将资源密集型自连接转换为更快的查询?

为什么Prisma生成唯一索引,而不是基于方案上的唯一列约束?

每组显示一行(表1中的分组值),表2中的不同列表用逗号分隔

如何嵌套两条SQL语句

在SQL中返回缺省值,即使查询不返回任何结果

查找表中特定值的上次更新日期

在SQL Server中设置关联对象的有效JSON格式

在SQL GROUP BY中的某些行之后执行计算

最小非重复集的SQL查询

Select 组中的第一行,但在并发环境中

将 json 列键映射到第二个表中的匹配列值

在特定条件下使用 LAG,确定要采用什么 LAG 值?

将空 JSON 数组添加到 SQL Server 表列中的 JSON 字符串

识别SQL Server中的重复数字

标量子查询中的窗口函数不起作用

从 varchar 列中删除特殊字符后的前面的零和字符时遇到问题

如何在 DAX 中通过 Window 函数应用订单

为什么 Oracle 在一个查询中对同一张表同时执行 TABLE SCAN 和 INDEX UNIQUE SCAN?

包含多行的 SQL 查询