sql - 基于条件的sql server中可能的记录组合
问题描述
我的输入如下:
c1 c2 req qty
1 A1 234 34
1 A1 547 45
1 A1 12P7 0.25
1 A1 12P8 0.25
1 A1 12P9 0.25
我的输出应该如下所示:(需要记录的组合与 'P' 作为每个 c1,c2 的值)
c1 c2 c3 req qty
1 A1 1 234 34
1 A1 1 547 45
1 A1 1 12P7 0.75
1 A1 2 234 34
1 A1 2 547 45
1 A1 2 12P8 0.75
1 A1 3 234 34
1 A1 3 547 45
1 A1 3 12P7 0.375
1 A1 3 12P8 0.375
1 A1 4 234 34
1 A1 4 547 45
1 A1 4 12P7 0.375
1 A1 4 12P9 0.375
1 A1 5 234 34
1 A1 5 547 45
1 A1 5 12P8 0.375
1 A1 5 12P9 0.375
解决方案
基本思想是枚举差异条件。一个技巧是分配req
. 这是通过计算总数并除以组中的行数来处理的:
select t.c1, t.c2, v.c3, t.req,
(case when t.req like '12%'
then (qty_total /
sum(case when t.req like '12%' then 1 else 0 end) over (partition by v.c3)
)
else qty
end)
from (select t.*, sum(case when req like '12%' then qty end) over () as qty_total
from t
) t cross join
(values (1), (2), (3), (4), (5)) v(c3)
where t.req not like '12%' or
(v.c3 = 1 and t.req in ('12P7') or
v.c3 = 2 and t.req in ('12P8') or
v.c3 = 3 and t.req in ('12P7', '12P8') or
v.c3 = 4 and t.req in ('12P7', '12P9') or
v.c3 = 5 and t.req in ('12P8', '12P9')
)
order by c3, c1, c2;
如果您的数据库不支持这种确切的语法,它支持类似的东西。
这是一个 db<>fiddle。
推荐阅读
- react-native - react-native run-ios --device 在 react-native 之后没有任何反应
- zendesk - 如何将现有的电话系统与 Zendesk 连接?
- sql - 数据集的最小值和总和
- command-prompt - 如何使用 .bat 文件为 MobaXterm 执行多任务命令
- react-native - 如何使用 react-navigation 传递道具,即 screenProps 和身份验证流程
- angular - 当我在 Angular 6 的输入标签中输入一些文本时,如何更改发送按钮颜色?
- eclipse - Eclipse Vaadin Widgetset 编译堆大小问题
- continuous-integration - 在声明性 Jenkins 脚本块中,我应该如何在执行命令时引用变量?
- asp.net - 我应该将身份服务器数据库与应用程序数据库合并吗?
- css - Wordpress中页脚下方的间隙