V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xoxo419
V2EX  ›  程序员

一条 SQL 可以完成这个报表?

  •  
  •   xoxo419 · 2018-01-17 12:19:41 +08:00 · 2491 次点击
    这是一个创建于 2509 天前的主题,其中的信息可能已经有所发展或是发生改变。

    a b c d 共四表

    • a -> 用户类型
    • b -> 用户表
    • c -> 订单表
    • d -> 订单商品表 (一订单对应多个商品)
    1. a.id a.title
    2. b.uid b.aid
    3. c.oid, c.uid, c.create_time
    4. d.id d.oid d.goods_name d.num d.price

    需求-统计分析

    条件 用户类型 下单时间

    报表格式

    小米 3 小米 6 苹果 4 苹果 6 苹果 X 金额

    用户类型 1 数量 数量 合计

    用户类型 2

    用户类型 3

    合计 合计 合计 总计

    第 1 条附言  ·  2018-01-18 16:53:36 +08:00

    [close]一条SQL没有解决到, 分三次查询了 传送门

    8 条回复    2018-01-17 18:28:30 +08:00
    daydaydayup
        1
    daydaydayup  
       2018-01-17 12:29:08 +08:00
    这个得看关联项了.有关联,100 张表都可以用一条 sql 做完
    rensuperk
        2
    rensuperk  
       2018-01-17 12:46:43 +08:00
    当然可以!难道你要我们免费帮你写 sql 吗,写这么详细?
    morefreeze
        3
    morefreeze  
       2018-01-17 12:50:17 +08:00
    你要问最后合计怎么出来的话 `WITH ROLLUP`
    这就是联表联成一条数据像这样
    a.id, b.uid, d.id, count(1), sum(d.price)
    然后再按 df.pivot(d.id) 转成矩阵形式吧。

    如果只能写 sql 的话 你需要知道所有商品类型 然后用 count(if(d.goods_name='小米 3', 1, null)) 这种类似的
    hugee
        4
    hugee  
       2018-01-17 13:01:00 +08:00 via Android
    可以
    runntuu
        5
    runntuu  
       2018-01-17 13:01:56 +08:00 via iPhone
    @hugee 一种就不上你当的即视感:-P
    chinvo
        6
    chinvo  
       2018-01-17 13:03:19 +08:00
    曾经写过三页 A4 长度的 SQL

    发现效率并不咋样

    然后果断老老实实 ORM + 业务逻辑 + 缓存 了
    chinvo
        7
    chinvo  
       2018-01-17 13:04:27 +08:00
    当然四个表做关联并不困难,@morefreeze #3 也给了解决思路
    c6h6benzene
        8
    c6h6benzene  
       2018-01-17 18:28:30 +08:00
    你是要 SQL Statement 直接出查询结果当报表,还是有其他的报表工具?

    不过看起来都是「一条」 SQL 能解决的,再不济可以 CTE 嘛。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2818 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 08:59 · PVG 16:59 · LAX 00:59 · JFK 03:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.