如果超过2/3满足一个值,则返回所有记录

古尔西

我有一个表,代表任何一天客户的多次交易。如果每位客户的三分之二或更多的交易是现金而不是信用卡,我需要退还每位客户的所有交易。

在下面的示例中,我要退回所有客户的1、4笔交易,因为他们是唯一拥有三分之二或更多交易现金的客户:

+ ---------------- + ------------- + ----------------- + ------------------ + 
| 交易编号| 客户编号| 交易类型| 交易价值| 
+ ---------------- + ------------- + ----------------- + ------------------ + 
| 1 | 1 | 现金| 11 | 
| 2 | 1 | 12 | 
| 3 | 1 | 现金| 13 | 
| 4 | 2 | 现金| 14 | 
| 5 | 2 | 15 | 
| 6 | 3 | 现金| 15 | 
| 7 | 3 | 11 |
| 8 | 3 | 现金| 12 | 
| 9 | 3 | 13 | 
| 10 | 4 | 现金| 14 | 
| 11 | 4 | 现金| 15 | 
| 12 | 4 | 现金| 15 | 
+ ---------------- + ------------- + ----------------- + ------------------ +
Damien_The_Unbeliever

这似乎适用于示例数据:

declare @t table (TranID int not null,CustomerNum int not null,
                  TranType varchar(17) not null,TranValue decimal(18,0) not null)
insert into @t(TranID,CustomerNum,TranType,TranValue) values
( 1,1,'Cash',11),    ( 2,1,'Card',12),    ( 3,1,'Cash',13),
( 4,2,'Cash',14),    ( 5,2,'Card',15),
( 6,3,'Cash',15),    ( 7,3,'Card',11),    ( 8,3,'Cash',12),    ( 9,3,'Card',13),
(10,4,'Cash',14),    (11,4,'Cash',15),    (12,4,'Cash',15)

;With Counted as (
    select *,
        COUNT(*) OVER (PARTITION BY CustomerNum) as cnt,
        SUM(CASE WHEN TranType='Cash' THEN 1 ELSE 0 END)
            OVER (PARTITION BY CustomerNum) as cashcnt
    from @t
)
select * from Counted
where cashcnt * 3 >= cnt * 2

最后,我进行了简单乘法运算,以将所有数学保持为整数,而不必考虑浮点数/小数和2/3的表示形式。

结果:

TranID      CustomerNum TranType          TranValue   cnt         cashcnt
----------- ----------- ----------------- ----------- ----------- -----------
1           1           Cash              11          3           2
2           1           Card              12          3           2
3           1           Cash              13          3           2
10          4           Cash              14          3           3
11          4           Cash              15          3           3
12          4           Cash              15          3           3

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果一个键的所有记录都满足条件,如何返回一条记录?

如果所有列都满足条件,则返回一个值的 Excel 函数

Postgres查询,如果满足条件,则有条件地从记录子集中返回一个值

如果满足每个条件一个条件,则列出所有值

如果值多次存在并且满足每个条件一个条件,请列出所有值

TSQL XML值返回所有记录的节点的第一个值

SQL过程返回一个表的所有值,如果存在另一个表则返回是/否

如果每个值至少满足一个条件,则将一个值分配给所有其他值

es6数组返回所有达到特定条件的项目,如果所有项目都满足条件,则返回第一个项目

如果至少一个单元格满足给定条件(例如,缺少值),则删除所有id行

SQL 更新循环将最后一个值返回给所有记录?

编写一个 SQLite 查询,返回日期早于某个值的所有记录

如果所有记录都存在于SQL Server的另一个表中,则返回行列表

如果两列满足一个条件,则返回其他列的计算值。熊猫 / 窗户

如果所有行都满足相同条件,并且只有一个满足条件,则选择行

返回具有另一个值的所有字段的SQL值-如果存在另一个值

如果不满足至少一个条件,则消除所有标识符

如果组内变量的所有值都超过某个值,如何创建一个取值为 1 的虚拟变量

如何定义所有值都属于另一个值并满足要求

如果第一个孩子有任何负值,则 getBoundingClientRect() 为所有孩子返回相同的值

如果只有一个值,则Java 8 Collector返回一个值

我正在尝试返回缺失值超过 n 个的所有行,我想将它们放在一个新的数据框中

Concur / Cognos 报告工作室 - 如果 culmn b 中的至少一个值满足条件,则显示 a 列中的所有项目

Excel 建立一个公式来查找记录并匹配该值,如果找到则返回一个值 YES

如果某个级别的所有观察值都具有相同的值,我如何改变一列以返回一个值?

Excel如果一列包含唯一值,而另一列包含一个真值,则返回这些唯一值的所有真值

如果一个属性等于另一属性,如何查找所有记录

如何对一个字段的所有记录的所有值求和?(Odoo 13)

无法连接三个表并仅返回一个表中的所有记录