上回说到那个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这下大家明白了吧.
当然不一定就是飞机轮船汽车的,只是一个比方.并且在生成的记录集中也不用直接使用记录中的内容作为字段名的.各位高手们,谢谢了,拜托了.
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这下大家明白了吧.
当然不一定就是飞机轮船汽车的,只是一个比方.并且在生成的记录集中也不用直接使用记录中的内容作为字段名的.各位高手们,谢谢了,拜托了.
(整句的就懂那么几句)
[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]
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]
User Carrier 飞机 轮船 汽车 Amount
张三 10 100 800 0 900
李四 11 0 350 0 350
王五 9 500 0 340 840
==========================================
如果一定要这结果,在access中可以用交叉表,sql server中则要用存储过程。。
交叉数据报表
有时候需要旋转结果以便在水平方向显示列,而在垂直方向显示行。这就是所谓的创建 PivotTable®、创建交叉数据报表或旋转数据。假定有一个表 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 都计算与本例显示相同的信息种类,但格式稍有不同。
[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];
如果:[Source-TrnspTpye](运输类型)的项目太多得到的結果的列就会很多,并且SQL語句就会很长
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语句谢谢各位捧场,问题解决了.下次再有问题的话,我会继续提问和散分的,呵呵