sql - 如果满足条件,SQL 将状态应用于帐户的每一行
问题描述
我有以下数据集,
并希望创建一个“标志”,其中任何具有 bucket_type = 'Self-pay' 和 bucket_status = 'Outstanding' 的帐户都会收到与该帐户有关的所有行的描述“Self-pay Outstanding”。其他情况可视为“N/A”。像这样:
我对 row_count()、partition by 和 case 语句有些熟悉,但我不确定如何将它们组合在一起以实现我想要的。我有以下代码,我在我的案例陈述中被绊倒了。
select
account
,bucket_type
,bucket_status
,case when bucket_type = 'Self-pay' and bucket_status = 'Outstanding' over (partition by account)
then 'Self-pay Outstanding' else null end
from account_table
非常感谢!
解决方案
用一个常见的表表达式试试这个
MS SQL Server 2017 架构设置:
CREATE TABLE Account_Table
(
Account VarChar(50),
Bucket_Type VarChar(50),
Bucket_Status VARCHAR(50)
);
INSERT INTO Account_Table
VALUES
('A', 'Self-pay', 'Outstanding'),
('A', 'Prebilled', 'Closed'),
('A', 'Primary', 'Closed'),
('B', 'Self-pay', 'Closed'),
('B', 'Prebilled', 'Closed'),
('B', 'Primary', 'Outstanding'),
('C', 'Primary', 'Closed'),
('C', 'Secondary', 'Outstanding')
查询 1:
WITH CTE
AS
(
SELECT DISTINCT Account, 'Self-pay Outstanding' as Flag
FROM Account_Table
WHERE
Bucket_Type = 'Self-Pay' AND
Bucket_Status = 'Outstanding'
)
SELECT A.Account, A.Bucket_Type, A.Bucket_Status, COALESCE(CTE.Flag, 'N/A') AS Flag
FROM Account_Table A
LEFT JOIN CTE
ON CTE.Account = A.Account
结果:
| Account | Bucket_Type | Bucket_Status | Flag |
|---------|-------------|---------------|----------------------|
| A | Self-pay | Outstanding | Self-pay Outstanding |
| A | Prebilled | Closed | Self-pay Outstanding |
| A | Primary | Closed | Self-pay Outstanding |
| B | Self-pay | Closed | N/A |
| B | Prebilled | Closed | N/A |
| B | Primary | Outstanding | N/A |
| C | Primary | Closed | N/A |
| C | Secondary | Outstanding | N/A |
推荐阅读
- python - 两个连接的两个数据框如何只有一个相同的列
- json - 如何使用超链接 C# 从复杂的 json 中获取价值
- swift - Firestore 数据库 - 文档未在集合中返回
- java - 如何从 URL 下载未知文件名?
- google-oauth - Google OAuth 响应查询字符串可以包含未编码的字符吗?
- identityserver4 - 在 ajax 请求上收到 400 错误。与当前用户不同的基于声明的用户的防伪令牌
- c++ - 为什么只有有效的空可变参数包的模板格式不正确?
- lua - 在 Lua 脚本中捕获和列出全局变量
- python - 从具有多个重复键的字典列表中创建一个字典,并从该列表中选择最大值
- laravel - 在 Laravel 中管理不同的活动日志