菜鸟求教sql查询语句,请高人指点~~~~

adslff 2010-12-11 08:57:31
现有表A,表B,表C,表D

表A字段为 账号 利息 利率

表B字段为 账号 地区号 账户名称

表C字段为 账号 OCX号

表D为总表 字段为 地区号 OCX号 账户名称 账号 余额(利息/利率)

假设表A 表B 表C皆有数据,表D为空

1.首先由表A的数据插入到表D的“账号”,“余额” 字段
2.匹配表D和表B的“账号”字段,更新表D的“地区号”,“ 账户名称”字段
3.匹配表D和表B的“账号”字段,更新表D的 “OCX号”字段

此时,得出表d的记录或为:

地区号 OCX号 账户名称 账号 余额
4041 1010 瑞信公司 955881212 1000
4041 1010 瑞信公司 955881313 1500
4041 1010 瑞信公司 955881414 1000
4042 1010 瑞信公司 955881717 5000
4042 1010 瑞信公司 955881818 5000

4.将表D的“地区号+OCX号”作为定义一个客户的标识

想将表D处理为:

地区号 OCX号 账户名称 账号 余额
4041 1010 瑞信公司 955881212,955881313,955881414 3500
4042 1010 瑞信公司 955881717,955881818 10000

5.此表D将作为1月份的总表,命名为表D1,同样还有2、3、4月份的总表,命名为D2,D3,D4,生成方法相同。

最终将生成一张表E,字段为 地区号 OCX号 账户名称 1月份余额 2月份余额 3月份余额 4月份余额
同样是用“地区号+OCX号”定义一个客户,汇总D1~D4。
----------------------------------------------------------------------------------------------------------

请教高人,按照步骤该如何写查询语句,或该如何对数据表定义属性,请尽量详细,万分感谢!!!



...全文
145 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
adslff 2010-12-12
  • 打赏
  • 举报
回复
5楼6楼的大侠,我用的是sql2000,在做到第4步的时候会报XML附近有语法错误

select 地区号,OCX号,账户名称,stuff((select ','+账号 from tb where 地区号=a.地区号 and OCX号=a.OCX号 for xml path('')),1,1,'') as 账号,sum(余额) as 余额
from tb a group by 地区号,OCX号,账户名称


请问有其他的解决办法么??
sysuleiw 2010-12-12
  • 打赏
  • 举报
回复
借用了5楼大哥的表,在此表示感谢!
第四步骤的结果如下:
4041 1010 瑞信公司 955881212,955881313,955881414 3500.00
4042 1010 瑞信公司 955881717,955881818 10000.00

第五步骤结果如下:
4041 1010 瑞信公司 3500.00 3500.00 3500.00 3500.00
4042 1010 瑞信公司 10000.00 10000.00 10000.00 10000.00
sysuleiw 2010-12-12
  • 打赏
  • 举报
回复

CREATE TABLE 表A
(
账号 VARCHAR(10),
利息 DECIMAL(10,2),
利率 DECIMAL(4,2)
)
CREATE TABLE 表B
(
账号 VARCHAR(10),
地区号 VARCHAR(10),
账户名称 VARCHAR(10)
)
CREATE TABLE 表C
(
账号 VARCHAR(10),
OCX号 VARCHAR(10)
)
CREATE TABLE 表D
(
地区号 VARCHAR(10),
OCX号 VARCHAR(10),
账户名称 VARCHAR(10),
账号 VARCHAR(10),
余额 DECIMAL(10,2)
)
INSERT INTO 表B
SELECT '955881212','4041','瑞信公司' UNION ALL
SELECT '955881313','4041','瑞信公司' UNION ALL
SELECT '955881414','4041','瑞信公司' UNION ALL
SELECT '955881717','4042','瑞信公司' UNION ALL
SELECT '955881818','4042','瑞信公司'

INSERT INTO 表A
SELECT '955881212',1000,1 UNION ALL
SELECT '955881313',1500,1 UNION ALL
SELECT '955881414',1000,1 UNION ALL
SELECT '955881717',5000,1 UNION ALL
SELECT '955881818',5000,1

INSERT INTO 表C
SELECT '955881212','1010' UNION ALL
SELECT '955881313','1010' UNION ALL
SELECT '955881414','1010' UNION ALL
SELECT '955881717','1010' UNION ALL
SELECT '955881818','1010'

--1.
INSERT INTO 表D(账号,余额)
SELECT 账号,利息/利率 FROM 表A
SELECT * FROM 表D

--2

update 表d
set 表d.地区号=表b.地区号 , 表d.账户名称=表b.账户名称
from 表B
where 表D.账号 like 表B.账号

--3
update 表d
set 表d.OCX号=表c.OCX号
from 表c
where 表D.账号 like 表c.账号


--4
--先自定义函数,用于字符串拼接
CREATE FUNCTION [dbo].[fun_strAppend](@areaID VARCHAR(10),@ocxID VARCHAR(10))
RETURNS varchar(8000)
AS
BEGIN
DECLARE @str varchar(8000)
SET @str = ''
SELECT @str = @str + ',' + 账号 FROM 表D where 地区号=@areaID and ocx号=@ocxID
return STUFF(@str, 1, 1, '')

END
--自定义函数结束

select 地区号 ,ocx号 ,账户名称, dbo.fun_strAppend(地区号,ocx号) as '账号',sum(余额)as '余额'
from 表D
group by 地区号 , ocx号 , 账户名称




--5

select 地区号 ,ocx号 ,账户名称, dbo.fun_strAppend(地区号,ocx号) as '账号',sum(余额)as '余额'
into d1--d2,d3,d4
from 表D
group by 地区号 , ocx号 , 账户名称

select d1.地区号,d1.ocx号,d1.账户名称,
d1.余额 as '1月份余额',d2.余额 as '2月份余额',d3.余额 as '3月份余额',d4.余额 as '4月份余额'
from d1
left join d2 on d1.地区号=d2.地区号 and d1.ocx号=d2.ocx号
left join d3 on d1.地区号=d3.地区号 and d1.ocx号=d3.ocx号
left join d4 on d1.地区号=d4.地区号 and d1.ocx号=d4.ocx号

--这里我用的d1作左连接,其实我觉得应该有一个地区号和ocx号的总表


dawugui 2010-12-11
  • 打赏
  • 举报
回复
只看第一个,1.首先由表A的数据插入到表D的“账号”,“余额” 字段
不知道如何对应你的数据?
后面就没兴趣看了.帮顶.
peizhou2010 2010-12-11
  • 打赏
  • 举报
回复
我是刚开始学SQL Server的学生!!!我也是个菜鸟!!不能帮你解答了
xzf_fancy 2010-12-11
  • 打赏
  • 举报
回复
create table tb(地区号 int,OCX号 int,账户名称 nvarchar(10),账号 varchar(10),余额 int)
insert into tb select 4041,1010,'瑞信公司','955881212',1000
insert into tb select 4041,1010,'瑞信公司','955881313',1500
insert into tb select 4041,1010,'瑞信公司','955881414',1000
insert into tb select 4042,1010,'瑞信公司','955881717',5000
insert into tb select 4042,1010,'瑞信公司','955881818',5000
go
select 地区号,OCX号,账户名称,stuff((select ','+账号 from tb where 地区号=a.地区号 and OCX号=a.OCX号 for xml path('')),1,1,'') as 账号,sum(余额) as 余额
from tb a group by 地区号,OCX号,账户名称
go
drop table tb
/*
地区号 OCX号 账户名称 账号 余额
----------- ----------- ---------- ---------------------------------------------------
4041 1010 瑞信公司 955881212,955881313,955881414 3500
4042 1010 瑞信公司 955881717,955881818 10000

(2 行受影响)

*/
飘零一叶 2010-12-11
  • 打赏
  • 举报
回复

CREATE TABLE 表A
(
账号 VARCHAR(10),
利息 DECIMAL(10,2),
利率 DECIMAL(4,2)
)
CREATE TABLE 表B
(
账号 VARCHAR(10),
地区号 VARCHAR(10),
账户名称 VARCHAR(10)
)
CREATE TABLE 表C
(
账号 VARCHAR(10),
OCX号 VARCHAR(10)
)
CREATE TABLE 表D
(
地区号 VARCHAR(10),
OCX号 VARCHAR(10),
账户名称 VARCHAR(10),
账号 VARCHAR(10),
余额 DECIMAL(10,2)
)
INSERT INTO 表B
SELECT '955881212','4041','瑞信公司' UNION ALL
SELECT '955881313','4041','瑞信公司' UNION ALL
SELECT '955881414','4041','瑞信公司' UNION ALL
SELECT '955881717','4042','瑞信公司' UNION ALL
SELECT '955881818','4042','瑞信公司'

INSERT INTO 表A
SELECT '955881212',1000,1 UNION ALL
SELECT '955881313',1500,1 UNION ALL
SELECT '955881414',1000,1 UNION ALL
SELECT '955881717',5000,1 UNION ALL
SELECT '955881818',5000,1

INSERT INTO 表C
SELECT '955881212','1010' UNION ALL
SELECT '955881313','1010' UNION ALL
SELECT '955881414','1010' UNION ALL
SELECT '955881717','1010' UNION ALL
SELECT '955881818','1010'

--1.
INSERT INTO 表D(账号,余额)
SELECT 账号,利息/利率 FROM 表A
SELECT * FROM 表D
--2.
UPDATE 表D
SET 地区号=表B.地区号,账户名称=表B.账户名称
FROM 表D JOIN 表B ON 表D.账号=表B.账号
SELECT * FROM 表D
--3.
UPDATE 表D
SET OCX号=表C.OCX号
FROM 表D JOIN 表C ON 表D.账号=表C.账号
SELECT * FROM 表D
--4.
SELECT 地区号
,OCX号
,账户名称
,STUFF((SELECT ','+账号 FROM 表D B WHERE B.地区号=A.地区号 AND B.OCX号=A.OCX号 AND B.账户名称=A.账户名称 FOR XML PATH('')),1,1,'') AS 账号
,SUM(余额) AS 余额
INTO D4 --D2,D3,D4
FROM 表D A GROUP BY 地区号,OCX号,账户名称
--5.
;WITH CTE AS
(
SELECT *, 1 AS 月份 FROM D1 UNION ALL
SELECT *, 2 AS 月份 FROM D2 UNION ALL
SELECT *, 3 AS 月份 FROM D3 UNION ALL
SELECT *, 4 AS 月份 FROM D4
)
SELECT * INTO E FROM CTE
PIVOT(SUM(余额) FOR 月份 IN([1],[2],[3],[4])) AS P
SELECT *FROM E




-晴天 2010-12-11
  • 打赏
  • 举报
回复
create table tb(地区号 int,OCX号 int,账户名称 nvarchar(10),账号 varchar(10),余额 int)
insert into tb select 4041,1010,'瑞信公司','955881212',1000
insert into tb select 4041,1010,'瑞信公司','955881313',1500
insert into tb select 4041,1010,'瑞信公司','955881414',1000
insert into tb select 4042,1010,'瑞信公司','955881717',5000
insert into tb select 4042,1010,'瑞信公司','955881818',5000
go
select 地区号,OCX号,账户名称,stuff((select ','+账号 from tb where 地区号=a.地区号 and OCX号=a.OCX号 for xml path('')),1,1,'') as 账号,sum(余额) as 余额
from tb a group by 地区号,OCX号,账户名称
go
drop table tb
/*
地区号 OCX号 账户名称 账号 余额
----------- ----------- ---------- ---------------------------------------------------
4041 1010 瑞信公司 955881212,955881313,955881414 3500
4042 1010 瑞信公司 955881717,955881818 10000

(2 行受影响)

*/
NetX行者 2010-12-11
  • 打赏
  • 举报
回复
LZ,你的思路是不是有点哆嗦。
给个资料给你参考,并不是你想要的。不过可能给你点思路
http://book115.com/a/shujukujishu/SQL_Server/2010/1128/24.html
adslff 2010-12-11
  • 打赏
  • 举报
回复
莫非是分少了,别沉呐~

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧