ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] sQL数据库关于3张表的查询语句

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-9-24 18:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
[code=sql]USE tempdb
IF OBJECT_ID('TEST1') IS NOT NULL
  DROP TABLE TEST1;  
GO
CREATE TABLE TEST1
(
  name nvarchar(10),
  pal  nvarchar(10)
);
GO
IF OBJECT_ID('TEST2') IS NOT NULL
  DROP TABLE TEST2;
GO
CREATE TABLE TEST2
(
  date date,
  name nvarchar(10),
  [in] int
);
GO
IF OBJECT_ID('TEST3') IS NOT NULL
  DROP TABLE TEST3;
GO
CREATE TABLE TEST3
(
  date date,
  name nvarchar(10),
  [out]int
);
GO
INSERT INTO TEST1 VALUES
('p1','大米'),
('p2','小麦'),
('p3','高粱'),
('p4','玉米'),
('p5','小米');
GO
INSERT INTO TEST2 VALUES
('2012-9-1','p1',10),
('2012-9-2','p2',30),
('2012-9-3','p3',50),
('2012-9-4','p4',20),
('2012-9-5','p5',15);
GO
INSERT INTO TEST3 VALUES
('2012-9-1','p1',25),
('2012-9-2','p4',35),
('2012-9-3','p1',50),
('2012-9-4','p4',40),
('2012-9-5','p2',10);
GO
SELECT A.name,A.pal,
       SUM(ISNULL(B.[in],0))  AS [in],
       SUM(ISNULL(C.[out],0)) AS [out]
FROM TEST1 AS A
LEFT JOIN TEST2 AS B
ON A.name = B.name
LEFT JOIN TEST3 AS C
ON A.name = C.name
GROUP BY A.name,A.pal
/*
name       pal        in          out
---------- ---------- ----------- -----------
p1         大米         20          75
p3         高粱         50          0
p2         小麦         30          10
p5         小米         15          0
p4         玉米         40          75

(5 行受影响)
*/ [/code]

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-9-25 11:39 | 显示全部楼层
本帖最后由 hw2166 于 2012-9-25 11:41 编辑
查询结果错误.png amazeyeli 发表于 2012-9-24 18:36


老师,你好,我用你教我的语句查询出来的结果怎么会出现如下的错误,请帮忙看一下错误在哪里,谢谢

  1. select * from c_dress_pal where c_style_id='24f03' and c_cloth_id='m12311'

  2. select c_style_id,c_cloth_id,sum(c_size1) as b1,sum(c_size2) as b2,sum(c_size3) as b3 from c_dress_stock
  3.        where c_style_id='24f03' and c_cloth_id='m12311' GROUP BY c_style_id,c_cloth_id

  4. select c_style_id,c_cloth_id,c_size1,c_size2,c_size3 from c_dress_stock
  5.        where c_style_id='24f03' and c_cloth_id='m12311'

  6. select c_style_id,c_cloth_id,sum(c_size1) as c1,sum(c_size2) as c2,sum(c_size3) as c3 from c_dress_sale_d
  7.        where c_style_id='24f03' and c_cloth_id='m12311' GROUP BY c_style_id,c_cloth_id

  8. select c_style_id,c_cloth_id,c_size1,c_size2,c_size3 from c_dress_sale_d
  9.        where c_style_id='24f03' and c_cloth_id='m12311'

  10. SELECT A.c_style_year,A.c_style_jijie,A.c_style_id,A.c_cloth_id,
  11.        SUM(ISNULL(B.[c_size1],0))  AS [b1],SUM(ISNULL(B.[c_size2],0))  AS [b2], SUM(ISNULL(B.[c_size3],0))  AS [b3],
  12.        SUM(ISNULL(C.[c_size1],0)) AS [c1],SUM(ISNULL(C.[c_size2],0)) AS [c2], SUM(ISNULL(C.[c_size3],0)) AS [c3]
  13. FROM c_dress_pal AS A
  14. LEFT JOIN c_dress_stock AS B
  15. ON A.c_style_id = B.c_style_id and A.c_cloth_id = B.c_cloth_id
  16. LEFT JOIN c_dress_sale_d AS C
  17. ON A.c_style_id = C.c_style_id and A.c_cloth_id = C.c_cloth_id where A.c_style_id='24f03' and A.c_cloth_id='m12311'
  18. GROUP BY A.c_style_year,A.c_style_jijie,A.c_style_id,A.c_cloth_id
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-9-25 11:43 | 显示全部楼层
amazeyeli 发表于 2012-9-24 18:36

老师,你好,我用你教我的语句查询出来的结果怎么会出现如下的错误,请帮忙看一下错误在哪里,谢谢

TA的精华主题

TA的得分主题

发表于 2012-9-25 12:45 | 显示全部楼层
产生了笛卡尔积,是我搞错了,大米的P1 in 只有10,join到3表时有两条,求和便成了20

应该先聚合,再关联

[code=sql]declare @i varchar(20) = '24f03',
        @j varchar(20) = 'm12311'
;with
a as
(
  select c_style_year,c_style_jijie,c_style_id,c_cloth_id
  from c_dress_pal
  where c_style_id=@i and c_cloth_id=@j
),
b as
(
  select c_style_id,c_cloth_id,
         sum(c_size1) as b1,sum(c_size2) as b2,sum(c_size3) as b3
  from c_dress_stock
  where c_style_id=@i and c_cloth_id=@j
  group by c_style_id,c_cloth_id
),
c as
(
  select c_style_id,c_cloth_id,
         sum(c_size1) as c1,sum(c_size2) as c2,sum(c_size3) as c3
  from c_dress_sale_d
  where c_style_id=@i and c_cloth_id=@j
  group by c_style_id,c_cloth_id
)
select a.*,b.b1,b.b2,b.b3,c.c1,c.c2,c.c3
from a
join b
on a.c_style_id = b.c_style_id and a.c_cloth_id = b.c_cloth_id
join c
on a.c_style_id = c.c_style_id and a.c_cloth_id = c.c_cloth_id [/code]


TA的精华主题

TA的得分主题

 楼主| 发表于 2012-9-25 13:27 | 显示全部楼层
amazeyeli 发表于 2012-9-25 12:45
产生了笛卡尔积,是我搞错了,大米的P1 in 只有10,join到3表时有两条,求和便成了20

应该先聚合,再关联

谢谢,又学会一样东西

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-9-25 15:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
amazeyeli 发表于 2012-9-25 12:45
产生了笛卡尔积,是我搞错了,大米的P1 in 只有10,join到3表时有两条,求和便成了20

应该先聚合,再关联

老师,你好,再请教一下,上边这段代码查询出来的结果必须是 a , b ,c三张表同时存在的数据才能显示出来,(a表中包括所有货品参数,b,c表中只有部分a表的数据,即a包含b,c)
如: 未标题-1.png

TA的精华主题

TA的得分主题

发表于 2012-9-25 15:15 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
你看下联机丛书
join
left join
right join
的区别

TA的精华主题

TA的得分主题

发表于 2012-9-25 15:16 | 显示全部楼层
按Shift+F1就会出现光标所在处的帮助

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-9-25 16:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
amazeyeli 发表于 2012-9-25 15:16
按Shift+F1就会出现光标所在处的帮助

我弄好了,谢谢老师
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-8 12:26 , Processed in 0.024830 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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