首页 新闻 搜索 专区 学院

求大侠解决SQL 交叉报表疑难问题

0
悬赏园豆:20 [待解决问题]

数据库表结构如下
项目       参与公司       设计费用     咨询费用     
A项目       A公司          200         300        
A项目       B公司          300         400        
B项目       B公司          400         500        
C项目       C公司          500         600        
...        ....         ...         ...
数据有一万多条,公司大概有1000多个

要求得到如下报表格式:
项目  A公司设计费用 A公司咨询费用  B公司设计费用 B公司咨询费用 C公司设计费用 C公司咨询费用 ...
A项目    200           300            300        400          0             0
B项目    0               0            400        500          0             0
C项目    0               0             0          0           500           600
...     ...             ...           ...        ...          ...          ...   ...

谢谢!


问题补充:

求大神SQL

★农民兄弟★的主页 ★农民兄弟★ | 初学一级 | 园豆:182
提问于:2013-06-26 14:54
< >
分享
所有回答(6)
0

这个转换以后列数都不知道有多少吧,表示有难度

仰望星空66 | 园豆:127 (初学一级) | 2013-06-26 14:57
0

你这报表可真吓人。

+小马哥++ | 园豆:906 (小虾三级) | 2013-06-26 16:54
0

下面这些是MySQL:
CREATE TABLE items(
item_name VARCHAR(50),
part_in_cmpny VARCHAR(50),
design_expenses INT,
consultant_expenses INT
)

DELETE FROM items;

INSERT INTO items VALUES ('A_item','A_cmpny',200,300);
INSERT INTO items VALUES ('A_item','A_cmpny',200,300);
INSERT INTO items VALUES ('A_item','B_cmpny',200,300);
INSERT INTO items VALUES ('B_item','A_cmpny',200,300);
INSERT INTO items VALUES ('B_item','C_cmpny',200,300);
INSERT INTO items VALUES ('C_item','A_cmpny',200,300);
INSERT INTO items VALUES ('B_item','C_cmpny',200,300);
INSERT INTO items VALUES ('C_item','A_cmpny',200,300);
INSERT INTO items VALUES ('C_item','C_cmpny',200,300);

SELECT * FROM items;


SELECT
i_outer.item_name,
(SELECT sum(design_expenses) FROM items i WHERE i_outer.item_name = i.item_name AND i.part_in_cmpny = 'A_cmpny') AS 'a_设计',
(SELECT sum(consultant_expenses) FROM items i WHERE i_outer.item_name = i.item_name AND i.part_in_cmpny = 'A_cmpny') AS 'a_咨询',
(SELECT sum(design_expenses) FROM items i WHERE i_outer.item_name = i.item_name AND i.part_in_cmpny = 'B_cmpny') AS 'b_设计',
(SELECT sum(consultant_expenses) FROM items i WHERE i_outer.item_name = i.item_name AND i.part_in_cmpny = 'B_cmpny') AS 'b_咨询',
(SELECT sum(design_expenses) FROM items i WHERE i_outer.item_name = i.item_name AND i.part_in_cmpny = 'C_cmpny') AS 'c_设计',
(SELECT sum(consultant_expenses) FROM items i WHERE i_outer.item_name = i.item_name AND i.part_in_cmpny = 'C_cmpny') AS 'c_咨询'
FROM
(SELECT
DISTINCT item_name
FROM
items) i_outer
;

执行结果:

A_item 400 600 200 300    
B_item 200 300     400 600
C_item 400 600     200 300

 

不知道你使用的是什么数据库,不过你写SQL的话我只能这么写,公司比较多的话你可以灵活写出SQL语句,或者你可以比较项目和公司的多寡来决定查询是不是应该反过来查。不管是哪一种办法,你都可以通过数据库把查询语句输出出来,也不是很费时。

如果你不满意的话,还可以写存储过程。

Wolfe Yu | 园豆:434 (菜鸟二级) | 2013-06-27 09:44

问题是

公司大概有1000多个
按照您的思路,这个SQL得有多大啊

支持(0) 反对(0) ★农民兄弟★ | 园豆:182 (初学一级) | 2013-06-27 16:03

@★农民兄弟★: 我只是给你SQL语句,如果你想通过SQL实现可以是以上的思路。

不过这个可以写存储过程来解决,存储过程就是再加一个循环。

其实使用SQL照样简单,可以使用拼接字符串的方法把SQL语句拼出来,分分钟的事情,问题都不是很大。主要是看你喜欢什么方法。下面我给你拼接SQL的办法吧。

首先用下面的语句生成查询的 SQL 语句:

SELECT DISTINCT
concat("(SELECT sum(design_expenses) FROM items i WHERE i_outer.item_name = i.item_name AND i.part_in_cmpny = '",part_in_cmpny,"') AS '",part_in_cmpny," 设计',
(SELECT sum(consultant_expenses) FROM items i WHERE i_outer.item_name = i.item_name AND i.part_in_cmpny = '",part_in_cmpny,"') AS '",part_in_cmpny," 咨询',")
FROM items

照你所说的大概会出来 1000多条的SQL语句,复制所有的SQL语句放到下面的省略号部分,把最后一条语句的逗号(,)去掉

SELECT
i_outer.item_name,
... ...
FROM
(SELECT
DISTINCT item_name
FROM
items) i_outer
;

最后执行就可以了。我已经试验成功。

支持(0) 反对(0) Wolfe Yu | 园豆:434 (菜鸟二级) | 2013-06-27 17:42
0

动态sql可以处理,现在好多报表本身也可以处理,其实没必要自己写sql了。麻烦还不讨好。

清海扬波 | 园豆:852 (小虾三级) | 2013-06-27 15:59

求您的例子,谢谢!

支持(0) 反对(0) ★农民兄弟★ | 园豆:182 (初学一级) | 2013-06-27 16:05
0

这不就是行转列么?SQLServer提供了函数PIVOT可以实现。

webaspx | 园豆:1975 (小虾三级) | 2013-06-28 09:55
0
s_p | 园豆:295 (菜鸟二级) | 2013-06-28 10:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册