数据库表结构如下
项目 参与公司 设计费用 咨询费用
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
这个转换以后列数都不知道有多少吧,表示有难度
你这报表可真吓人。
下面这些是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语句,或者你可以比较项目和公司的多寡来决定查询是不是应该反过来查。不管是哪一种办法,你都可以通过数据库把查询语句输出出来,也不是很费时。
如果你不满意的话,还可以写存储过程。
问题是
公司大概有1000多个
按照您的思路,这个SQL得有多大啊
@★农民兄弟★: 我只是给你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
;
最后执行就可以了。我已经试验成功。
动态sql可以处理,现在好多报表本身也可以处理,其实没必要自己写sql了。麻烦还不讨好。
求您的例子,谢谢!
这不就是行转列么?SQLServer提供了函数PIVOT可以实现。