产品表:
pd_id    pd_name   pd_spec  ...
0001       主板     ASUS
0002       显卡     ATI
0003       键盘     SAMSUNG
0004       显卡     TNT2
.............货架表:
hj_id    hj_name
1          1#
2          2#
3          3#
.................货架摆放表:
auto_id    hj_id    pd_id    qty
1            1      0001      5
2            2      0003      7
3            3      0001      5
4            2      0002      1
5            3      0002      4
...........怎样可以得到以下结果,也就是每个产品在货架上的摆放情况:
hj_name    pd_name    pd_spec         qty
1#           主板       ASUS           5
2#           主板       ASUS           0
3#           主板       ASUS           5
1#           显卡       ATI            0
2#           显卡       ATI            1
3#           显卡       ATI            4
1#           键盘       SAMSUNG        0
2#           键盘       SAMSUNG        7
3#           键盘       SAMSUNG        0
1#           显卡       TNT            0
2#           显卡       TNT            0
3#           显卡       TNT            0
...................请帮帮帮忙,谢谢谢谢!PS:时常发现做统计时要连接多个表,且要进行汇总或是其他计算,比方说上面的问题,如果我要是再加表进行统计,有没有个通用的方法呢?

解决方案 »

  1.   

    这样的报表做出来不感觉挺无聊的啊
    浪费屏幕,浪费纸张、浪费CPU运行时间、浪费用电
    哈哈
      

  2.   

    select c.hj_name,d.pd_name,isnull(b.qty,0) as qty
    from (
    select a.pd_id,b.hj_id from 货架表 a cross join 产品表 b
    ) a left join 货物摆放表 b 
    on a.hj_id=b.hj_id and a.pd_id=b.pd_id
    join 货架表 c on a.hj_id=c.hj_id
    join 产品表 d on a.pd_id=d.pd_id
      

  3.   

    create table 产品表(pd_id varchar(10), pd_name varchar(10), pd_spec varchar(10))
    insert 产品表
    select '0001', '主板', 'ASUS'  union all
    select '0002', '显卡', 'ATI' union all
    select '0003', '键盘', 'SAMSUNG'  union all
    select '0004', '显卡', 'TNT2'  create table 货架表(hj_id varchar(10), hj_name varchar(10))
    insert 货架表
    select '1', '1#'  union all
    select '2', '2#' union all
    select '3', '3#'  create table 货架摆放表(auto_id int identity(1,1), hj_id varchar(10), pd_id varchar(10), qty int)
    insert 货架摆放表
    select '1', '0001', 5 union all
    select '2', '0003', 7 union all
    select '3', '0001', 5 union all
    select '2', '0002', 1 union all
    select '3', '0002', 4
    goselect 
    c.hj_name,d.pd_name,d.pd_spec,isnull(b.qty,0) as qty
    from 
    (
    select a.pd_id,b.hj_id from 货架表 b cross join 产品表 a
    ) a 
    left join 
    货架摆放表 b on a.hj_id=b.hj_id and a.pd_id=b.pd_id
    join 
    货架表 c on a.hj_id=c.hj_id
    join 
    产品表 d on a.pd_id=d.pd_id
    order by 
    d.pd_specdrop table 产品表,货架表,货架摆放表/*
    hj_name pd_name pd_spec qty
    1# 主板 ASUS 5
    2# 主板 ASUS 0
    3# 主板 ASUS 5
    1# 显卡 ATI 0
    2# 显卡 ATI 1
    3# 显卡 ATI 4
    1# 键盘 SAMSUNG 0
    2# 键盘 SAMSUNG 7
    3# 键盘 SAMSUNG 0
    1# 显卡 TNT2 0
    2# 显卡 TNT2 0
    3# 显卡 TNT2 0
    */
      

  4.   


    create table 产品表(pd_id varchar(10), pd_name varchar(10), pd_spec varchar(10))
    insert 产品表
    select '0001', '主板', 'ASUS' union all
    select '0002', '显卡', 'ATI'union all
    select '0003', '键盘', 'SAMSUNG' union all
    select '0004', '显卡', 'TNT2' create table 货架表(hj_id varchar(10), hj_name varchar(10))
    insert 货架表
    select '1', '1#' union all
    select '2', '2#'union all
    select '3', '3#' create table 货架摆放表(auto_id int identity(1,1), hj_id varchar(10), pd_id varchar(10), qty int)
    insert 货架摆放表 select '1', '0001', 5
    union all select '2', '0003', 7
    union all select '3', '0001', 5
    union all select '2', '0002', 1
    union all select '3', '0002', 4go
    select hj_name,pd_name,pd_spec,
    isnull((select qty from 货架摆放表 c where c.hj_id=a.hj_id and c.pd_id=b.pd_id),0) as'qty' 
    from 货架表 a , 产品表 b order by b.pd_id,a.hj_name------结果/*
    hj_name    pd_name    pd_spec         qty
    1#           主板       ASUS           5
    2#           主板       ASUS           0
    3#           主板       ASUS           5
    1#           显卡       ATI            0
    2#           显卡       ATI            1
    3#           显卡       ATI            4
    1#           键盘       SAMSUNG        0
    2#           键盘       SAMSUNG        7
    3#           键盘       SAMSUNG        0
    1#           显卡       TNT            0
    2#           显卡       TNT            0
    3#           显卡       TNT            0*/
      

  5.   

    gc_ding(施主,给个妞泡好么) 
    可以分析一下我们的哪个快吗!
      

  6.   

     回复人:wei123456(onedotone) ( 一级(初级)) 信誉:100
    我也是每天查数查的痛不欲生
      

  7.   

    楼主用的是相关查询,一般用连接比用子查询效率高,不过cross join也不会快很多
    两种方法应该差不多
    你可以拿多一点数据试试看