sql 求助

2021-01-19 22:35:39 +08:00
 wuwukai007

这条 sql 是在写不出来了😔,下面是简化的表结构和条件。

user_id username
1 张三
2 李四
3 王五
order_id user_id order_name create_time is_active shift
1 1 001 2020-01-01 12:12:12 0 day
2 1 001 2020-01-01 23:00:00 1 night
3 1 002 2020-01-01 12:12:12 1 day
4 1 002 2020-01-01 23:00:00 0 night
class_id order_id sw_class
1 1 采购
2 2 消费
3 2 消费
4 3 消费
5 4 消费
效果:
    查询姓名为张三的订单 
    并根据订单的创建日期,班次(night,day),是否激活 is_active,作为一组条件
    统计订单所属类别(表三) sw_class 的数量
    例如 张三 在 2020-01-01 这一天,有订单
    is_activce = 1 的 且 shift = night 的 订单 为 order_id = 2
    那么类别有 class_id (2,3),消费消费 ,
    那么就有一条记录:    
    
       
username is_active shift date sw_采购 sw_消费 sw_采购占订单总数比例 sw_消费占订单总数比例
张三 1 night 2020-01-01 0 2 2/2 0/2

结果例如:

username is_active shift date sw_采购 sw_消费 sw_采购占订单总数比例 sw_消费占订单总数比例
张三 0 night 2020-01-01 0 1 1/1 0/1
张三 1 night 2020-01-01 0 2 2/2 0/2
张三 0 day 2020-01-01 1 0 1/1 0/1
张三 1 day 2020-01-01 0 1 0/1 1/1
1524 次点击
所在节点    Python
3 条回复
saulshao
2021-01-20 10:30:32 +08:00
我建议你多次查询数据库,逻辑上更简单清楚
zlowly
2021-01-20 11:47:47 +08:00
不是很看得懂你的例子,只能大概猜测是你这里可能涉及到一个行转列的查询技巧,即多行的 sw_class 转换为两列 sw_采购,sw_消费,不知这样理解对否。
通常这种查询,如果最终列数是固定非动态的,可以用这种思路转换:

select a,b,c,...sw as sw_采购,0 as sw_消费 from t where sw_class="采购"
union all
select a,b,c,...0 as sw_采购,sw as sw_消费 from t where sw_class="消费"

然后在这个基础上在外层包装分组统计运算。
kmonster
2021-01-20 11:57:36 +08:00
一个 sql 行转列,一般这种问题都是面试的时候吧?而且只有很 low 的公司老项目才有这种类型的 SQL 。
现在写 SQL 基本上是越简单越好,然后再用代码去做逻辑处理,不建议联表,会有笛卡尔积问题。
一般项目到后面都是数据层的压力比较大。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/746461

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX