上回说到那个sum,还说到了子查询,最后呢,生成了一个N长的SQL如下:
Select 
  [User-Name], [User-Office], [User-City], 
  [Source-Carrier], Sum(Source-Amount]) 
from 
  (Select 
     [User-Office], [User-City], [User-VendorType], 
     [User-Scorp], [Source-Carrier], [User-Name], 
     [Source-TrnspTpye], [Source-BkgBlType], [Source-Origin],
     [Source-Destination], [Source-EqpType], [Source-Unit], 
     [Source-Rate], [Source-Amount], [Source-Currency] 
   From 
     T_S, T_U 
   Where 
     T_S.[Source-Carrier] = T_U.[User-Carrier]) 
group by [User-Name], [User-Office], [User-City],  [Source-Carrier]这次的问题呢,要从头说起,希望高手看清楚之后再回答我,因为我是低,很容易被误导的哦^-^一共有两个表T_S (Source)和T_U (USER)
T_S中存放了一些销售记录之类的数据,这个表的内容是天天在变的;
T_U中存放的是用户的信息,当然,这个表的内容很少改变,因为用户相对稳定.
两个表通过一个叫做Carrier Number的数字对应,这可以从开头的那个SQL的子查询中看出来.通过那个子查询,我们得到了一个 用户信息<-->销售信息 的记录集
然后通过那个SUM和GROUP BY,得到了单个用户的总销售量.但是呢,现在又有个新的条件要添加上去:
在T_S这个表中有个字段:[Source-TrnspTpye](运输类型),这个字段的值有几种固定值.
在本贴开头的那个SQL中只得到一个用户的总销售量.
现在还要求加上针对不同[Source-TrnspTpye]的值而归类的销售量.
有点拗口,我举例子说明一下,假设子查询得到下列数据:
User Carrier TrnspTpye   Amount
张三   10      飞机       100
李四   11      轮船       150
王五   9       汽车       90
张三   10      轮船       300
王五   9       飞机       400
王五   9       汽车       250
李四   11      轮船       200
王五   9       飞机       100
张三   10      轮船       500通过开头的那个SQL语句,我们得到的结果是:
User Carrier Amount
张三   10      900
李四   11      350
王五   9       840二现在新的要求呢,还需要列出针对不同的TrnspTpye的值得到的小计:
User Carrier 飞机 轮船 汽车 Amount  
张三   10    100  800   0    900
李四   11     0   350   0    350
王五   9     500   0   340   840这下大家明白了吧.
当然不一定就是飞机轮船汽车的,只是一个比方.并且在生成的记录集中也不用直接使用记录中的内容作为字段名的.各位高手们,谢谢了,拜托了.

解决方案 »

  1.   

    SQL语句半句不懂,,,顶楼主,,,,,,,
    (整句的就懂那么几句)
      

  2.   

    应该是这样:Select
    [User-Name], [User-Office], [User-City],
    [Source-Carrier],[Source-TrnspTpye],Sum(Source-Amount])
    from
    (Select
    [User-Office], [User-City], [User-VendorType],
    [User-Scorp], [Source-Carrier], [User-Name],
    [Source-TrnspTpye], [Source-BkgBlType], [Source-Origin],
    [Source-Destination], [Source-EqpType], [Source-Unit],
    [Source-Rate], [Source-Amount], [Source-Currency],[Source-TrnspTpye] 
    From
    T_S, T_U
    Where
    T_S.[Source-Carrier] = T_U.[User-Carrier])
    group by [User-Name], [User-Office], [User-City], [Source-Carrier],[Source-TrnspTpye]
      

  3.   

    再仔细看了一下,这个查询好像不必这么复杂啊,直接这样子写:
    Select
    [User-Name], [User-Office], [User-City],
    [Source-Carrier],[Source-TrnspTpye],Sum(Source-Amount])
    From
    T_S, T_U
    Where
    T_S.[Source-Carrier] = T_U.[User-Carrier])
    group by [User-Name], [User-Office], [User-City], [Source-Carrier],[Source-TrnspTpye]
      

  4.   

    二现在新的要求呢,还需要列出针对不同的TrnspTpye的值得到的小计:
    User Carrier 飞机 轮船 汽车 Amount  
    张三   10    100  800   0    900
    李四   11     0   350   0    350
    王五   9     500   0   340   840
    ==========================================
    如果一定要这结果,在access中可以用交叉表,sql server中则要用存储过程。。
      

  5.   

    楼上说得对,在access中,用交叉表可以完成,在sql中就不知道有没有交叉表这个功能,以前听一个网友说过,也像也可以,不过复杂一些。如下:
    交叉数据报表
    有时候需要旋转结果以便在水平方向显示列,而在垂直方向显示行。这就是所谓的创建 PivotTable&reg;、创建交叉数据报表或旋转数据。假定有一个表 Pivot,其中每季度占一行。对 Pivot 的 SELECT 操作在垂直方向上列出这些季度:Year      Quarter      Amount
    ----      -------      ------
    1990      1           1.1
    1990      2           1.2
    1990      3           1.3
    1990      4           1.4
    1991      1           2.1
    1991      2           2.2
    1991      3           2.3
    1991      4           2.4生成报表的表必须是这样的,其中每年占一行,每个季度的数值显示在一个单独的列中,如:Year Q1 Q2 Q3 Q4
     
    1990 1.1 1.2 1.3 1.4
     
    1991 2.1 2.2 2.3 2.4
     
    下面的语句用于创建 Pivot 表并在其中填入第一个表中的数据:USE Northwind
    GOCREATE TABLE Pivot
    ( Year      SMALLINT,
      Quarter   TINYINT, 
      Amount      DECIMAL(2,1) )
    GO
    INSERT INTO Pivot VALUES (1990, 1, 1.1)
    INSERT INTO Pivot VALUES (1990, 2, 1.2)
    INSERT INTO Pivot VALUES (1990, 3, 1.3)
    INSERT INTO Pivot VALUES (1990, 4, 1.4)
    INSERT INTO Pivot VALUES (1991, 1, 2.1)
    INSERT INTO Pivot VALUES (1991, 2, 2.2)
    INSERT INTO Pivot VALUES (1991, 3, 2.3)
    INSERT INTO Pivot VALUES (1991, 4, 2.4)
    GO下面是用于创建旋转结果的 SELECT 语句:SELECT Year, 
        SUM(CASE Quarter WHEN 1 THEN Amount ELSE 0 END) AS Q1,
        SUM(CASE Quarter WHEN 2 THEN Amount ELSE 0 END) AS Q2,
        SUM(CASE Quarter WHEN 3 THEN Amount ELSE 0 END) AS Q3,
        SUM(CASE Quarter WHEN 4 THEN Amount ELSE 0 END) AS Q4
    FROM Northwind.dbo.Pivot
    GROUP BY Year
    GO该 SELECT 语句还处理其中每个季度占多行的表。GROUP BY 语句将 Pivot 中一年的所有行合并成一行输出。当执行分组操作时,SUM 聚合中的 CASE 函数的应用方式是这样的:将每季度的 Amount 值添加到结果集的适当列中,在其它季度的结果集列中添加 0。如果该 SELECT 语句的结果用作电子表格的输入,那么电子表格将很容易计算每年的合计。当从应用程序使用 SELECT 时,可能更易于增强 SELECT 语句来计算每年的合计。例如:SELECT P1.*, (P1.Q1 + P1.Q2 + P1.Q3 + P1.Q4) AS YearTotal
    FROM (SELECT Year,
                 SUM(CASE P.Quarter WHEN 1 THEN P.Amount ELSE 0 END) AS Q1,
                 SUM(CASE P.Quarter WHEN 2 THEN P.Amount ELSE 0 END) AS Q2,
                 SUM(CASE P.Quarter WHEN 3 THEN P.Amount ELSE 0 END) AS Q3,
                 SUM(CASE P.Quarter WHEN 4 THEN P.Amount ELSE 0 END) AS Q4
         FROM Pivot AS P
         GROUP BY P.Year) AS P1
    GO带有 CUBE 的 GROUP BY 和带有 ROLLUP 的 GROUP BY 都计算与本例显示相同的信息种类,但格式稍有不同。
      

  6.   

    1 kssys 说的对:Select
     [User-Name], [User-Office], [User-City], [Source-Carrier],[Source-TrnspTpye],Sum([Source-Amount])
    From
     T_S, T_U
    Where
     T_S.[Source-Carrier] = T_U.[User-Carrier])
    Group By
     [User-Name], [User-Office], [User-City], [Source-Carrier],[Source-TrnspTpye]就可以实现功能。2 交叉查询:
    TRANSFORM Sum([Source-Amount]) AS SumofAmont
    SELECT [User-Name], [User-Office], [User-City], [Source-Carrier],Sum([Source-Amount]) AS Amont
    FROM T_S, T_U
    WHERE T_S.[Source-Carrier] = T_U.[User-Carrier])
    GROUP BY [User-Name], [User-Office], [User-City], [Source-Carrier]
    PIVOT [Source-TrnspTpye];
      

  7.   

    不知楼主的SQL語句是不是在VB中執行
    如果:[Source-TrnspTpye](运输类型)的项目太多得到的結果的列就会很多,并且SQL語句就会很长
      

  8.   

    谢谢of123() 的最终答案:
    TRANSFORM Sum([Source-Amount]) AS SumofAmont
    SELECT [User-Name], [User-Office], [User-City], [Source-Carrier],
    Sum([Source-Amount]) AS Amont
    FROM T_S, T_U
    WHERE T_S.[Source-Carrier] = T_U.[User-Carrier]
    GROUP BY [User-Name], [User-Office], [User-City], [Source-Carrier]
    PIVOT [Source-TrnspTpye];谢谢xmf_jx() 帮我分析和简化SQL语句谢谢各位捧场,问题解决了.下次再有问题的话,我会继续提问和散分的,呵呵