表1(货物总数)
类型  总数
 A    900
 B    1000表2(使用了的货物)
 类型  使用数
  A      20
  B      60
  A      11
现在要求用一句sql语句打印出A,B各剩了多少

解决方案 »

  1.   

    create table T1 (类型 varchar(100), 总数 int)insert into T1 select 'A',    900
    insert into T1 select 'B',    1000
    create table T2 (类型 varchar(100), 使用数 int)
    insert into T2 select 'A',      20
    insert into T2 select 'B',      60
    insert into T2 select 'A',      11
    select 类型,sum(数量) as 剩余数量
    from 
        (
         select 类型,总数 as 数量
         from T1
         union all
         select 类型,使用数*(-1) as 数量
         from T2
        ) as t
    group by 类型drop table T1,T2
    /*--结果类型     剩余数量
    A       869
    B       940*/
      

  2.   

    select a.类型,(a.总数-b.使用数)[剩]
    from
    表1 a join
    (select  类型,  sum(使用数)使用数 from 表2 group by 类型)b
    on a.类型=b.类型
      

  3.   


    --创建测试表T1
    create table T1 (类型 varchar(100), 总数 int)--追加测试数据
    insert into T1 select 'A',    900
    insert into T1 select 'B',    1000--创建测试表T2
    create table T2 (类型 varchar(100), 使用数 int)--追加测试数据
    insert into T2 select 'A',      20
    insert into T2 select 'B',      60
    insert into T2 select 'A',      11
    --你要的SQL语句
    select 类型,sum(数量) as 剩余数量
    from 
        (
         select 类型,总数 as 数量
         from T1
         union all
         select 类型,使用数*(-1) as 数量
         from T2
        ) as t
    group by 类型
    --删除测试表
    drop table T1,T2
    /*--结果类型     剩余数量
    A       869
    B       940*/
      

  4.   

    用union all方式处理的,可以确保 有总数、无使用,或者有使用、无总数的,也能统计出来。
      

  5.   

    那换full join 就要以了!!
      

  6.   

    --光full join,还不够,需要用isnull()函数,否则,都是空--如:
    --创建测试表T1
    create table T1 (类型 varchar(100), 总数 int)--追加测试数据
    insert into T1 select 'A',    900
    insert into T1 select 'B',    1000
    insert into T1 select 'C',    1000--创建测试表T2
    create table T2 (类型 varchar(100), 使用数 int)--追加测试数据
    insert into T2 select 'A',      20
    insert into T2 select 'B',      60
    insert into T2 select 'A',      11
    --你要的SQL语句
    select 类型,sum(数量) as 剩余数量
    from 
        (
         select 类型,总数 as 数量
         from T1
         union all
         select 类型,使用数*(-1) as 数量
         from T2
        ) as t
    group by 类型
    select a.类型,(isnull(a.总数,0)-isnull(b.使用数,0)) as [剩余数量]
    from T1 a 
        full join (select  类型,sum(使用数)使用数 from T2 group by 类型)b
    on a.类型=b.类型--删除测试表
    drop table T1,T2
    /*--结果类型     剩余数量
    A       869
    B       940*/
      

  7.   

    select 类型,总数-(select sum(表2.使用数) from 表2 where 表1.类型 = 表2.类型)
    from 表1没错!
    还是第一次答贴
      

  8.   

    select a.類型,a.總數-b.使用數 as balance from t1 a
    left join
    (
    select 類型,sum(使用數)as 使用數 from t2 group by 類型
    ) b on a.類型=b.類型類型                                                                                                   balance     
    ---------------------------------------------------------------------------------------------------- ----------- 
    A                                                                                                    869
    B                                                                                                    940(2 row(s) affected)
      

  9.   


    create table 表1 (类型 varchar(100), 总数 int)insert into 表1 select 'A',    900
    insert into 表1 select 'B',    1000
    insert into 表1 select 'C',    1000
    create table 表2 (类型 varchar(100), 使用数 int)
    insert into 表2 select 'A',      20
    insert into 表2 select 'B',      60
    insert into 表2 select 'A',      11
    insert into 表2 select 'D',      11select isnull(a.类型,b.类型)[类型],(isnull(a.总数,0)-isnull(b.使用数,0))[剩]
    from
    表1 a full join
    (select  类型,  sum(使用数)使用数 from 表2 group by 类型)b
    on a.类型=b.类型
      

  10.   

    --按照题目,这个最简单select a.类型, 剩余=a.总数-sum(b.使用数) from 表1 a, 表2 b where a.类型=b.类型 group by a.类型, a.总数
      

  11.   

    --按照题意,现实中也是这个最简单,因为如果出现同一个A有两个不同的总数,那就是原始数据错了。declare @T1 table (类型 varchar(1), 总数 int)
    insert @T1
    select 'A',900 union all
    select 'B',1000declare @T2 table (类型 varchar(1), 使用数 int)
    insert @T2
    select 'A',20 union all
    select 'B',60 union all
    select 'A',11select a.类型, 剩余=a.总数-sum(b.使用数) from @T1 a, @T2 b where a.类型=b.类型 group by a.类型, a.总数/*
    类型 剩余
    A 869
    B 940
    */
      

  12.   

    니 바보 야 !
      

  13.   

    回复人:yes196196() ( 一级(初级)) 信誉:100  2007-08-31 13:36:42  得分:0select 类型,总数-(select sum(表2.使用数) from 表2 where 表1.类型 = 表2.类型)
    from 表1没错!
    还是第一次答贴---------------------------------------------确实没错
      

  14.   

    虽然题目简单,但是也学到了不少东西
    原来以为只要减一下就可以了,没有想到为了保证安全需要用 union all
    学习了,哈哈
    g g study d d up
      

  15.   

    不用union all也可以,但是需要在full join方式中,两个字段相减时加isnull(),否则会出现NULL
      

  16.   

    select a.类型 , a.总数 - isnull(b.使用数) 0 剩余数 from tb1 a
    left join
    (select 类型 , sum(使用数) 使用数 from tb2 group by 类型) b
    on a.类型 = b.类型
      

  17.   

    create table tb1(类型 varchar(10), 总数 int)
    insert into tb1 values('A',    900)
    insert into tb1 values('B',    1000)
    create table tb2(类型 varchar(10), 使用数 int)
    insert into tb2 values('A',    20)
    insert into tb2 values('B',    60)
    insert into tb2 values('A',    11)
    go
    select a.类型 , a.总数 - isnull(b.使用数,0) 剩余数 from tb1 a
    left join
    (select 类型 , sum(使用数) 使用数 from tb2 group by 类型) b
    on a.类型 = b.类型
    order by a.类型
    drop table tb1,tb2/*类型         剩余数         
    ---------- ----------- 
    A          869
    B          940(所影响的行数为 2 行)
    */
      

  18.   

    如果允许负销售,只用left join,还不够,还需要union上 right join
      

  19.   

    还有负销售,没东西如何销售?如果真有,就把left join 改为 full joincreate table tb1(类型 varchar(10), 总数 int)
    insert into tb1 values('A',    900)
    insert into tb1 values('B',    1000)
    create table tb2(类型 varchar(10), 使用数 int)
    insert into tb2 values('A',    20)
    insert into tb2 values('B',    60)
    insert into tb2 values('A',    11)
    insert into tb2 values('C',    11)
    go
    select isnull(a.类型,b.类型) 类型 , isnull(a.总数,0) - isnull(b.使用数,0) 剩余数 from tb1 a
    full join
    (select 类型 , sum(使用数) 使用数 from tb2 group by 类型) b
    on a.类型 = b.类型
    order by a.类型
    drop table tb1,tb2/*
    类型         剩余数         
    ---------- ----------- 
    A          869
    B          940
    C          -11(所影响的行数为 3 行)
    */
      

  20.   

    SELECT
    A.类型,(SUM(A.总数) - SUM(B.使用数)) 剩余数
    FROM
    (
      SELECT 类型,SUM(总数) 总数
      FROM 表1
      GROUP BY 类型
    ) A,
    (
      SELECT 类型,SUM(使用数) 使用数
      FROM 表2
      GROUP BY 类型
    ) B
    WHERE A.类型=B.类型
    GROUP BY A.类型
      

  21.   

    create table T1 (类型 varchar(100), 总数 int)insert into T1 select 'A',    900
    insert into T1 select 'B',    1000
    create table T2 (类型 varchar(100), 使用数 int)
    insert into T2 select 'A',      20
    insert into T2 select 'B',      60
    insert into T2 select 'A',      11select a.类型,a.总数-b.使用数 from (select 类型,sum(使用数) as 使用数 from t2 group by 类型) b,t1 a where a.类型=b.类型drop table t1,t2
      

  22.   

    几种都有:
    USE DEMO GO 
    CREATE TABLE TABLE1(
    G_TYPE VARCHAR(3),
    G_AMOUNT INT 
    )
    INSERT INTO TABLE1(G_TYPE,G_AMOUNT)VALUES ('A',900)
    INSERT INTO TABLE1(G_TYPE,G_AMOUNT)VALUES ('B',1000)
    CREATE TABLE DETAILS
    (
    G_TYPE VARCHAR(3),
    USED_AMOUNT INT
    )
    insert into details values('A',20)
    insert into details values('B',60)
    insert into details values('A',11)
    ---TEST SELECT SUM (G_AMOUNT) FROM 
    (
    SELECT G_TYPE,G_AMOUNT FROM TABLE1
    union all 
    SELECT G_TYPE,USED_AMOUNT*(-1) FROM DETAILS
    ) RESULTselect a.g_type,a.G_amount-isnull(b.USED_AMOUNT,0) as lefts from table1 a left join
     (select g_type,sum(used_amount) as USED_AMOUNT from details group by g_type) b on a.g_type=b.g_type order by a.g_type
      

  23.   

    declare @t table(lei varchar(10),zong int)
    insert into @t
    select 'a',800
    union all select 'b',1000
    declare @b table(lei varchar(10),yong int)
    insert into @b
    select 'a',200
    union all select 'b',11
    union all select 'a',20
    select b.lei,shengyu=a.zong-sum(b.yong) from @t a inner join @b b on a.lei=b.lei group by b.lei,a.zong
      

  24.   

    declare @t table(lei varchar(10),zong int)
    insert into @t
    select 'a',800
    union all select 'b',1000
    union all select 'c',1000
    --你的汉字变成拼音了
    declare @b table(lei varchar(10),yong int)
    insert into @b
    select 'a',200
    union all select 'b',11
    union all select 'a',20
    union all select 'd',15select isnull(a.lei,b.lei),(isnull(a.zong,0)-isnull(b.yong,0)) sheng from @t a 
    full join (select lei, sum(yong) yong from @b group by lei) b 
    on a.lei=b.lei
      

  25.   

    Limpire(昨夜小楼)答案对,也简单。