三个表:供应商,表单,记录,例如:
  供应商:
       供应商ID, 供应商Name
          1    ,  AAA
          2    ,  BBB
          ...     ...  表单:  
       表单ID,供应商ID
          1   ,  1
          2   ,  1
          3   ,  2
        ...     ...
  记录:
       记录ID,表单ID, 金额
          1  ,  1     , 100
          2  ,  2     , 200
          3  ,  1     , 500
          4  ,  3     , 200
          5  ,  1     , 500    现在想得到每个表单的供应商Name及总金额,如下:         表单ID,供应商Name,总金额
            1   ,AAA      ,1100
            2   ,AAA      ,500
            ...   ...        ....
    我现在用的是:
            SELECT 表单ID, SUM(记录.金额)
             FROM  记录
             Group By 表单ID
   这样当然只能得到每个ID对应的总金额,但却无法得到每个ID对应的供应商Name。
               
            如果直接写成:
            SELECT  表单.表单ID,  供应商.供应商Name,  SUM(记录.金额)
             FROM 表单,记录,供应商
             WHERE 表单.供应商ID=供应商.供应商ID
             Group By 表单ID
             
            会出错,我知道为什么出错。可怎样如何把两个表连接起来,同时还要有group by进行分组呢?
我觉得这个问题应该有人问过吧,查了一下没查到,所以发上来问问大家。谢谢!

解决方案 »

  1.   

    我不会发图片。。
    想得到的效果如下:
     
     表单ID, 供应商Name,   总金额
        1 ,      AAA ,      1100
       2 ,     AAA ,        500
       3,      BBB,         400   得到每一个表单的总金额数,及每一个表单的供应商Name,需要三个表进行连接。
        1、表“供应商”提供供应商Name,及供应商ID;
        2、表“表单”提供表单ID,及对应的供应商ID;
        3、表“记录”提供表单ID,及每个表单的金额(表单可以重复)      简单说吧,用group by进行分组后,如何与其他表进行连接。
    谢谢!
      

  2.   

    SELECT 表单.表单ID, 供应商.供应商Name, SUM(记录.金额)
      FROM 表单,记录,供应商
      WHERE 表单.供应商ID=供应商.供应商ID AND 记录.表单ID=表单.表单ID
      Group By 表单ID,供应商.供应商Name
      

  3.   


    SELECT 表单.表单ID, 供应商.供应商Name, SUM(记录.金额)
      FROM 表单,记录,供应商
      WHERE 表单.供应商ID=供应商.供应商ID AND 记录.表单ID=表单.表单ID
      Group By 表单.表单ID,供应商.供应商Name
      

  4.   

    楼上的那样写好像不行吧,比如只有2个供应商,却有10个单子,那么按:       Group By 表单.表单ID,供应商.供应商Name
      进行分组,最后是不是只得到两行?
      

  5.   

    CREATE TABLE Vendor
    (
    VendorID int identity,
    VendorName VARCHAR(20)
    )
    GO
    CREATE TABLE List
    (
    ListID int identity,
    VendorID int 
    )
    GO
    CREATE TABLE Record
    (
    RecordID int identity,
    ListID int,
    [Money] int
    )
    GO
    INSERT INTO Vendor  select 'Huawei'
    INSERT INTO Vendor  select 'IBM'
    INSERT INTO Vendor  select 'Google'INSERT INTO List  select 1
    INSERT INTO List  select 2
    INSERT INTO List  SELECT 3INSERT INTO Record  SELECT  1,200
    INSERT INTO Record  SELECT 2,300
    INSERT INTO Record  SELECT 3,400SELECT DISTINCT L.ListID,V.VendorNAME,R.MONEY
    FROM Vendor v,LIST L
    LEFT JOIN
    (
    SELECT r.ListID, SUM(R.[Money])OVER(PARTITION BY R.ListID) [MONEY]
    FROM Record r
    )R
    ON R.ListID=L.ListID
    WHERE V.VendorID=L.VendorID
    ORDER BY L.ListID
    ListID      VendorNAME           MONEY
    ----------- -------------------- -----------
    1           Huawei               200
    2           IBM                  300
    3           Google               400(3 row(s) affected)
      

  6.   

    6#的还是有点问题,LZ可以参考着改改把多于的null部分处理掉就可以了。
      

  7.   

    参考以下例子 ,自己做的。只是表名不同,结构是相 同的
    问题说明:有三个表,项目表、合同表、付款表
    一个项目可能会有签署多个合同,每个合同会分几次付款。--下面是建立表的语句
    create table 项目(项目编号 int,项目名称 varchar(50))
    insert 项目 
    select 1, '项目1'
    union 
    select 2, '项目2'
    union 
    select 3, '项目3'
    create table 合同(合同编号 int,项目编号 int,合同金额 numeric(7,3))insert 合同
    select 1,1,1000
    union 
    select 2,1,1500
    union 
    select 3,2,2000create table 付款(付款编号 int,合同编号 int,付款金额 numeric(7,3))insert 付款
    select 1,1,100
    union 
    select 2,2,200
    union 
    select 3,2,800问题(一):
    设计一个查询,要求返回结果如下:
    ----------------------------------------------------------
    项目编号    项目名称             项目所有合同的金额      
    ----------- ------------------------ --------------------- 
    1           项目1                    2500
    2           项目2                    2000
    3           项目3                    NULL
    问题(二):
    设计一个查询,要求返回结果如下:
    --------------------------------------
    项目编号    项目所有合同已付款金额    
    ----------- --------------------------
    1           1100
    2           NULL
    --------------------------------------问题(三)
    设计一个查询,要求返回结果如下:
    项目编号    项目名称        项目所有合同已付款金额  
    ----------- ---------------------------------------- 
    1           项目1   1100
    2           项目2   NULL
    ----------------------------------------------------问题(四):
    请您设计一个查询语句,检索的格式如下:
    ------------------------------------------------------------------------
    项目编号    项目名称    项目所有合同的金额    项目所有合同已付款金额  
    ------------------------------------------------------------------------
    1           项目1        2500.000              1100.000
    2           项目2        2000.000              NULL
    ------------------------------------------------------------------------考核点:问题一、二、三考核连接、分组统计的综合运用
     问题四考核连接、分组统计、子查询的综合运用--1 select a.*,项目所有合同的金额 from dbo.项目 as a inner join (select 项目编号,sum(合同金额) 项目所有合同的金额 from 合同 group by 项目编号) b on a.项目编号=b.项目编号
     --2 select a.项目编号,sum(付款金额) 项目所有合同金额 from dbo.合同 a left join dbo.付款 b on a.合同编号=b.合同编号 group by a.项目编号 
    --3 select e.项目编号,e.项目名称,d.项目所有合同已付款金额 from (select a.项目编号,sum(付款金额) 项目所有合同已付款金额 from dbo.合同 a left join dbo.付款 b on a.合同编号=b.合同编号 group by a.项目编号) as d inner join dbo.项目 e on d.项目编号=e.项目编号
     --4 select e.项目编号,e.项目名称,d.项目所有合同已付款金额,f.项目所有合同的金额 from (select a.项目编号,sum(付款金额) 项目所有合同已付款金额 from dbo.合同 a left join dbo.付款 b on a.合同编号=b.合同编号 group by a.项目编号) as d inner join dbo.项目 e on d.项目编号=e.项目编号 inner join (select a.*,项目所有合同的金额 from dbo.项目 as a inner join (select 项目编号,sum(合同金额) 项目所有合同的金额 from 合同 group by 项目编号) b on a.项目编号=b.项目编号) f on d.项目编号=f.项目编号 -