SQL如何完成多张表的报表?

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
合计 合计 合计 ... ... ... 总计
阅读 2.8k
2 个回答

思路: 先查出注册用记的类型, 然后再用户类型的数组再循环订单中所有的商品.

//语句可查出第一列(用户类型) 最后一列(金额)
select m.uid,a.id,
                    sum((select 
                        sum((select sum(p.num * p.price) from {$pfix}d p where p.oid = o.id)
                    ) as user_amount
                    from {$pfix}c o where o.uid = m.uid)) as user_order_total
                    from {$pfix}b m 
                    JOIN {$pfix}a a ON m.aid = a.id
                    group by a.id
//查出所以订单的商品类型
select product_id,product_name from {$pfix}d group by product_id
//循环出上列表格
        foreach ($data as $key => $value) { //AND o.create_time > 1516204800 下单时间条件
            $userSql = "select o.id from {$pfix}b m 
                        RIGHT JOIN {$pfix}c o ON o.uid = m.uid where m.aid= {$value ['id']} {$where}
            "; //查出用户类型下所有用户订单
            $userData = $model->query($userSql);
            if(!empty($userData)) {
                
                $userWhere = implode(',', array_column($userData, 'id'));
                foreach ($productData as $k => $v) {
                    $amountSql = "select sum(num) as amount_total from {$pfix}d where product_id = {$v ['product_id']} AND oid IN({$userWhere})";
                    $amount = $model->query($amountSql);
                    $amount = $amount [0]['amount_total'];
                    $data [$key]['product'][$v ['product_id']] = array('amount_total' => $amount);
                }
                dump($productData);
            }
        }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏