none
如何使用Group By RRS feed

  • 问题

  • 我想用Group By合计一些列,数据表简化如下:

    我用下列查询句,结果是错误的,不知道错在哪里?

    select product.Name 'Product',
    sum(buy.Quantity) 'Buy Qty',
    sum(sale.Quantity) 'Sale Qty',
    sum(buy.Quantity) - sum(sale.Quantity) 'Balance'
    from Product, buy, Sale
    where product.PID = buy.PID and product.PID = Sale.PID
    group by product.PID, Product.Name

    • 已移动 ThankfulHeart 2012年7月10日 8:00 SQL问题 (发件人:Visual C#)
    2012年7月10日 7:39

答案

  • 您好!再请教一下,如果要查询下列结果该怎样写查询句:

    Date  PID  BuyQty  SaleQty

    1/7    1     10

    2/7    2     20

    3/7    1     10

    5/7    1                 2

    5/7    2                 3

    6/7    1                 4

    6/7    2                 5

    select Date ,PID,ltrim(qty) as BuyQty,'' as SaleQty from Buy
    union all
    select Date ,PID,'',ltrim(qty) from Sale


    • 已标记为答案 栾涅 2012年7月11日 1:53
    2012年7月10日 13:46
    版主
  • --> 测试数据:@Product
    declare @Product table([PID] int,[Name] varchar(7))
    insert @Product
    select 1,'Nugget' union all
    select 2,'Seafood'
    
    --> 测试数据:@Buy
    declare @Buy table([Date] varchar(3),[PID] int,[Qty] int)
    insert @Buy
    select '1/7',1,10 union all
    select '2/7',2,20 union all
    select '3/7',1,10
    
    --> 测试数据:@Sale
    declare @Sale table([Date] varchar(3),[PID] int,[Qty] int)
    insert @Sale
    select '5/7',1,2 union all
    select '5/7',2,3 union all
    select '6/7',1,4 union all
    select '6/7',2,5
    
    select [Name],
    	(select sum(Qty) from @Buy where PID=t.PID) as  BuyQty,
    	(select sum(Qty) from @Sale where PID=t.PID) as  SaleQty,
    	(select sum(Qty) from @Buy where PID=t.PID)-
    	(select sum(Qty) from @Sale where PID=t.PID) as Balance
    from @Product t
    
    /*
    Name    BuyQty      SaleQty     Balance
    ------- ----------- ----------- -----------
    Nugget  20          6           14
    Seafood 20          8           12
    */
    

    • 已标记为答案 栾涅 2012年7月10日 8:28
    2012年7月10日 8:15
    版主

全部回复

  • 不知怎样图片传不上去,我重抄如下:

    Product Table

    PID Name

    1    Nugget

    2    Seafood

    -------------------------

    Buy Table

    Date   PID   Qty

    1/7     1       10

    2/7     2       20

    3/7     1       10

    -------------------------

    Sale Table

    Date   PID   Qty

    5/7     1       2

    5/7     2       3

    6/7     1       4

    6/7     2       5

    --------------------------------

    我想要的结果是:

    Product  BuyQty  SaleQty  Balance

    Nugget     20         6        14

    Seafood    20         8        12

    现在的问题是用上述查询句,合计的数目和上列不一样,是错的。不知错在哪里?
    • 已编辑 栾涅 2012年7月10日 8:02 少了提问题。
    2012年7月10日 7:58
  • --> 测试数据:@Product
    declare @Product table([PID] int,[Name] varchar(7))
    insert @Product
    select 1,'Nugget' union all
    select 2,'Seafood'
    
    --> 测试数据:@Buy
    declare @Buy table([Date] varchar(3),[PID] int,[Qty] int)
    insert @Buy
    select '1/7',1,10 union all
    select '2/7',2,20 union all
    select '3/7',1,10
    
    --> 测试数据:@Sale
    declare @Sale table([Date] varchar(3),[PID] int,[Qty] int)
    insert @Sale
    select '5/7',1,2 union all
    select '5/7',2,3 union all
    select '6/7',1,4 union all
    select '6/7',2,5
    
    select [Name],
    	(select sum(Qty) from @Buy where PID=t.PID) as  BuyQty,
    	(select sum(Qty) from @Sale where PID=t.PID) as  SaleQty,
    	(select sum(Qty) from @Buy where PID=t.PID)-
    	(select sum(Qty) from @Sale where PID=t.PID) as Balance
    from @Product t
    
    /*
    Name    BuyQty      SaleQty     Balance
    ------- ----------- ----------- -----------
    Nugget  20          6           14
    Seafood 20          8           12
    */
    

    • 已标记为答案 栾涅 2012年7月10日 8:28
    2012年7月10日 8:15
    版主
  •  其实可以不用group by 的。如果分步用也可以:

    --> 测试数据:@Product
    declare @Product table([PID] int,[Name] varchar(7))
    insert @Product
    select 1,'Nugget' union all
    select 2,'Seafood'
    
    --> 测试数据:@Buy
    declare @Buy table([Date] varchar(3),[PID] int,[Qty] int)
    insert @Buy
    select '1/7',1,10 union all
    select '2/7',2,20 union all
    select '3/7',1,10
    
    --> 测试数据:@Sale
    declare @Sale table([Date] varchar(3),[PID] int,[Qty] int)
    insert @Sale
    select '5/7',1,2 union all
    select '5/7',2,3 union all
    select '6/7',1,4 union all
    select '6/7',2,5
    
    ;with t1 as 
    (
    	select pid,sum(qty) as qty from @buy group by pid
    ),t2 as 
    (
    	select pid,sum(qty) as qty from @sale group by pid
    ),t3 as 
    (
    	select t1.pid,t1.qty as buyqty,t2.qty as saleqty 
    	from t1,t2 
    	where t1.pid=t2.pid
    ),t4 as 
    (
    	select a.name,b.buyqty,b.saleqty,b.buyqty-b.saleqty as balance
    	from @product a 
    	left join t3 b on a.[pid]=b.[pid]
    )
    select * from t4
    
    /*
    Name    BuyQty      SaleQty     Balance
    ------- ----------- ----------- -----------
    Nugget  20          6           14
    Seafood 20          8           12
    */
    

    2012年7月10日 8:32
    版主
  • 我试了,答案正确,谢谢您!
    2012年7月10日 8:34
  • 您好!再请教一下,如果要查询下列结果该怎样写查询句:

    Date  PID  BuyQty  SaleQty

    1/7    1     10

    2/7    2     20

    3/7    1     10

    5/7    1                 2

    5/7    2                 3

    6/7    1                 4

    6/7    2                 5

    2012年7月10日 9:20
  • 您好!再请教一下,如果要查询下列结果该怎样写查询句:

    Date  PID  BuyQty  SaleQty

    1/7    1     10

    2/7    2     20

    3/7    1     10

    5/7    1                 2

    5/7    2                 3

    6/7    1                 4

    6/7    2                 5

    select Date ,PID,ltrim(qty) as BuyQty,'' as SaleQty from Buy
    union all
    select Date ,PID,'',ltrim(qty) from Sale


    • 已标记为答案 栾涅 2012年7月11日 1:53
    2012年7月10日 13:46
    版主
  • 答案正确,谢谢您!

    如想把buy.date和sale.date合并为Date列,是否可以用Coalesce?

    2012年7月11日 1:53
  • 学习了  

    给我写信: QQ我:点击这里给我发消息

    2012年7月11日 1:55
  • 如果两列合并成一列可以用Coalesce 或是 isnull。

    但是你的Date我已经合并成一列了呀?

    select Date ,PID,qty from Buy union all select Date ,PID,qty from Sale

    这样就都合并了..

    2012年7月11日 3:43
    版主
  • 是的,答案已正确无误,只是我想知道如用Coalesce是否会使查询句更简洁?

    2012年7月11日 4:14
  • 用联合?

    给我写信: QQ我:点击这里给我发消息

    2012年7月11日 4:34
  • join语句不行,因为两个表的数据都要合并,所以只能union了

    给我写信: QQ我:点击这里给我发消息

    2012年7月11日 5:06
  • 原来是这样,谢谢您!
    2012年7月11日 5:26