ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1277|回复: 2

[求助] 在SQL里,如何对同一字段里相应的数值进行计算

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-9-8 08:36 | 显示全部楼层 |阅读模式
在SQL SERVER 2012 EXPRESS里,数据表结构如下:
代码日期指标名称指标数值
1
1990-12-31
货币资金
7648000
1
1990-12-31
应收账款
56280000
1
1990-12-31
总资产
104912000
1
1991-12-31
货币资金
8648000
1
1991-12-31
应收账款
57280000
1
1991-12-31
总资产
105912000
1
1992-12-31
货币资金
9648000
1
1992-12-31
应收账款
58280000
1
1992-12-31
总资产
106912000
2
1990-12-31
货币资金
10648000
2
1990-12-31
应收账款
59280000
2
1990-12-31
总资产
107912000
2
1991-12-31
货币资金
11648000
2
1991-12-31
应收账款
60280000
2
1991-12-31
总资产
108912000
2
1992-12-31
货币资金
12648000
2
1992-12-31
应收账款
61280000
2
1992-12-31
总资产
109912000

【需求】编写SQL语句,将代码和日期均相同的某指标数值除以另一指标的数值。
例如:
计算“代码”=“1”,“日期”=“1990-12-31”时的“货币资金÷总资产”,生产一条新的记录:
代码日期指标名称指标数值
1
1990-12-31
货币资金/总资产
0.0728992

由于数据库里的“代码”很多,日期也很多,希望能批量计算!

多谢各位大侠帮助!!!


TA的精华主题

TA的得分主题

发表于 2013-9-8 13:21 | 显示全部楼层
注意:
1.我把你这个提供的示例表叫作【来源表】
2.我估且让为你的字段【日期】为varchar等文本类的,而非date类的


Select A.代码,A.日期,(A.指标名称 +'/'+B.指标名称) as 指标名称,(A.指标数值/B.指标数值) As 指标数值  From
(Select 来源表.* From 来源表 Where 代码='1'  And 指标名称='货币资金') A INNER JOIN (Select 来源表.* From 来源表 Where 代码='1'  And 指标名称='总资产') B On A.代码=B.代码 And A.日期=B.日期 Where
A.日期='1990-12-31'

TA的精华主题

TA的得分主题

发表于 2013-9-9 10:44 | 显示全部楼层
[code=sql]USE tempdb
GO
IF OBJECT_ID('TEST') IS NOT NULL
  DROP TABLE TEST;
GO
CREATE TABLE TEST
(
  代码                        CHAR(8),
  日期                        DATE,
  指标名称        NVARCHAR(10),
  指标数值        MONEY
);
GO
INSERT INTO TEST VALUES('1','1990-12-31','货币资金',7648000);
INSERT INTO TEST VALUES('1','1990-12-31','应收账款',56280000);
INSERT INTO TEST VALUES('1','1990-12-31','总资产',104912000);
INSERT INTO TEST VALUES('1','1991-12-31','货币资金',8648000);
INSERT INTO TEST VALUES('1','1991-12-31','应收账款',57280000);
INSERT INTO TEST VALUES('1','1991-12-31','总资产',105912000);
INSERT INTO TEST VALUES('1','1992-12-31','货币资金',9648000);
INSERT INTO TEST VALUES('1','1992-12-31','应收账款',58280000);
INSERT INTO TEST VALUES('1','1992-12-31','总资产',106912000);
INSERT INTO TEST VALUES('2','1990-12-31','货币资金',10648000);
INSERT INTO TEST VALUES('2','1990-12-31','应收账款',59280000);
INSERT INTO TEST VALUES('2','1990-12-31','总资产',107912000);
INSERT INTO TEST VALUES('2','1991-12-31','货币资金',11648000);
INSERT INTO TEST VALUES('2','1991-12-31','应收账款',60280000);
INSERT INTO TEST VALUES('2','1991-12-31','总资产',108912000);
INSERT INTO TEST VALUES('2','1992-12-31','货币资金',12648000);
INSERT INTO TEST VALUES('2','1992-12-31','应收账款',61280000);
INSERT INTO TEST VALUES('2','1992-12-31','总资产',109912000);
GO
----------------------------------------
;WITH A AS
(SELECT * FROM TEST PIVOT (MAX(指标数值) FOR 指标名称 IN(货币资金,应收账款,总资产))P),
B AS (SELECT 代码,日期,'货币资金/总资产' AS 指标名称,货币资金/总资产 AS 指标数值 FROM A),
C AS (SELECT 代码,日期,'应收账款/总资产' AS 指标名称,应收账款/总资产 AS 指标数值 FROM A)
SELECT * FROM B UNION ALL SELECT * FROM C ORDER BY 1,2
----------------------------------------
/*
代码       日期         指标名称            指标数值
-------- ---------- --------------- ---------------------
1        1990-12-31 货币资金/总资产        0.0728
1        1990-12-31 应收账款/总资产        0.5364
1        1991-12-31 货币资金/总资产        0.0816
1        1991-12-31 应收账款/总资产        0.5408
1        1992-12-31 应收账款/总资产        0.5451
1        1992-12-31 货币资金/总资产        0.0902
2        1990-12-31 应收账款/总资产        0.5493
2        1990-12-31 货币资金/总资产        0.0986
2        1991-12-31 货币资金/总资产        0.1069
2        1991-12-31 应收账款/总资产        0.5534
2        1992-12-31 应收账款/总资产        0.5575
2        1992-12-31 货币资金/总资产        0.115

(12 行受影响)
*/[/code]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 16:16 , Processed in 0.038969 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表