刚才有同事问如何将多行查询结果按列返回, 要求不用CASE,DECODE等...(300分)

  • 主题发起人 主题发起人 tseug
  • 开始时间 开始时间
T

tseug

Unregistered / Unconfirmed
GUEST, unregistred user!
我用了一个中间表完成, 大家还有什么高见
CREATE TABLE "TEST1"
(
"A" INTEGER,
"B" INTEGER
);

INSERT INTO "TEST1" VALUES (1 , 10);
INSERT INTO "TEST1" VALUES (2 , 20);
INSERT INTO "TEST1" VALUES (3 , 30);
INSERT INTO "TEST1" VALUES (4 , 40);
INSERT INTO "TEST1" VALUES (5 , 50);

CREATE TABLE "TEST2"
(
"A" INTEGER,
"B1" INTEGER,
"B2" INTEGER,
"B3" INTEGER,
"B4" INTEGER,
"B5" INTEGER
);

INSERT INTO "TEST2" VALUES (1, 1 , 0 , 0 , 0 , 0);
INSERT INTO "TEST2" VALUES (2, 0 , 1 , 0 , 0 , 0);
INSERT INTO "TEST2" VALUES (3, 0 , 0 , 1 , 0 , 0);
INSERT INTO "TEST2" VALUES (4, 0 , 0 , 0 , 1 , 0);
INSERT INTO "TEST2" VALUES (5, 0 , 0 , 0 , 0 , 1);

SELECT SUM(TEST1.B*TEST2.B1),SUM(TEST1.B*TEST2.B2),SUM(TEST1.B*TEST2.B3),SUM(TEST1.B*TEST2.B4),SUM(TEST1.B*TEST2.B5)
FROM TEST1, TEST2
WHERE TEST1.A=TEST2.A;


 
旋转矩阵表嘛,就是干这个用的,有点哗众取宠的嫌疑哦:)
不过要看具体需求,有的需求就不适合了,如列数不固定切教多等情形,可以考虑建立
维和方体,OLAP或OLAM的一些技术来实现比较对路,可以长久得满足这些问题域中的需求。
 
这样不是可以得到正确答案吗,你是想怎么作?????????
 
to wangjiankang_71;
能否详细说说, 如果列数不固定的时候怎么处理, 因为我这种办法只适用于列数固定的时候
 
列数不固定就先查出需要多少列,然后动态的拼创建这个临时表的sql。

我以前做过一个,是用decode实现的,列数不固定,只好在后台拼查询的sql,
嘿嘿,挺好玩儿的。
 
wang的意思大概是使用OlapServer建立多维立方体。
使用MDX进行查询。
我也不是很懂的说。[:)]
 
to 小猪: 多谢, 但是这种办法很笨重.
to bubble: 能否讲讲MDX? 一般的SQL数据库支持么?
 
sql7和sql2000都支持,oracle没用过,不过肯定也可以。
(Oracle也有数据仓库解决方案)
安装的时候安装Analisis Service和联机帮助,MDX有详解。
MDX适用于OlapServer(联机分析处理),须事先建立多维方体。
我也没仔细研究过MDX,不过看起来你的问题就是一个维度及指标旋转的问题,
这在Olap里是非常容易实现的,这是决策支持系统里面最简单最常见的东西。
其实我也是一知半解。[:)]

联机丛书最好装中文版。
SQL 和 MDX 之间最显著的区别在于 MDX 具有引用多个维度的能力。
尽管在 Microsoft® SQL Server™ 2000 Analysis Services
中存在单独使用 SQL 查询多维数据集的可能性,但是 MDX
所提供的命令却可以专门检索具有几乎任意多个维度的多维数据结构中的数据。
SQL 处理查询时仅涉及列和行这两个维度。因为 SQL 只设计用来处理二维表格
格式数据,所以"列"和"行"这两个术语在 SQL 语法中具有意义。
比较而言,MDX 在查询中则可处理一个、两个、三个或更多的维度。
因为 MDX 中可以使用多个维度,所以每个维度称作一个轴。MDX
中的"列"和"行"这两个术语在 MDX 查询中仅用作前两个轴维度的别名;
还有其它指派了别名的维度,但对于 MDX 这些别名本身没有真实意义。
MDX 支持这些别名是为了显示;许多 OLAP 工具不能显示具有两个以上维度的结果集。
在 SQL 中,SELECT 子句用于定义查询的列布局,而 WHERE 子句用于定义行布局。
可是在 MDX 中 SELECT 子句可用于定义几个轴维度,而 WHERE 子句可用来多维数
据限制于特定的维度或成员。


 
多人接受答案了。
 
后退
顶部