求一个查询语句(更新中文解释望WWWWA和各位大牛帮忙解答)

point_net 2012-09-26 05:20:18
非常抱歉,原来没有中文输入法。。。
我有个一个表1
产品名称 解释 开始日期 结束日期
A a1a1a1 10/09/2012 19/09/2012
A a2a2a2 01/09/2012 08/09/2012
A a3a3a3 11/08/2012 15/08/2012
B b1b1b1 01/08/2012 09/08/2012
B b2b2b2 02/08/2012 10/08/2012
C
D d1d1d1 05/08/2012 12/08/2012
E
我希望通过查询得到如下表2
产品 产品数量 各个产品的解释 各个产品所用天数 同一产品总共用天数
A 3
a1a1a1 9
a2a2a2 7 20(9+7+4)
a3a3a3 4
B 2
b1b1b1 8 16
b2b2b2 8
C 0 0
D d1d1d1 7 7
E 0 0
解释
表1 比如A产品,有三个解释(也可理解为使用方法),三个解释(使用方法)分别有不同的开始日期和截止日期那么在
表2中,要显示这5列
产品A 有3个(因为表1的A一共有三个) 每个产品A的解释(使用方法) 每个产品A使用天数 三个产品A所用天数的总和

谢谢各位大牛在另外一个帖子的回帖,非常感谢!!!WWWWA在另一个帖子的代码已经可以运行,但是是我没解释清楚题意,所以和要得到的结果有偏差。。。

...全文
139 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwwb 2012-09-27
  • 打赏
  • 举报
回复
这个代码中的WHERE name=A.name能不能去掉? 不能

如果那句where加入不正确们是不是求不出来总和啊 是

但是日期总和能不能和产品数量在同一行呢? 可以,用子查询

单独运行,看看结果是否正确

SELECT SUM(DATEDIFF("D", UNDOSOLODATA.STARTDATE11, UNDOSOLODATA.ENDDATE11))
FROM
SOLODATA INNER JOIN UNDOSOLODATA ON SOLODATA.[SOLODATALINK] = UNDOSOLODATA.[SOLODATALINK] WHERE SOLODATA.TAGNUMBER<>""
point_net 2012-09-27
  • 打赏
  • 举报
回复
好,我在试试,我就是()A这样写的, 不过它老是说join有错,谢了哈
wwwwb 2012-09-27
  • 打赏
  • 举报
回复
自己根据上述思路多试试,看看SQL方面的基础知识
...

SELECT SUM(DATEDIFF("D", UNDOSOLODATA.STARTDATE11, UNDOSOLODATA.ENDDATE11))
FROM UNDOSOLODATA WHERE A.[SOLODATALINK] = [SOLODATALINK]

FROM
(select * from SOLODATA INNER JOIN UNDOSOLODATA ON SOLODATA.[SOLODATALINK] = UNDOSOLODATA.[SOLODATALINK]) WHERE SOLODATA.TAGNUMBER<>"") A
point_net 2012-09-27
  • 打赏
  • 举报
回复
我这些数据其实是一次操作两个表SOLODATA和UNDOSOLODATA,谢了哈
point_net 2012-09-27
  • 打赏
  • 举报
回复
SELECT SUM(DATEDIFF("D", UNDOSOLODATA.STARTDATE11, UNDOSOLODATA.ENDDATE11))
FROM UNDOSOLODATA WHERE SOLODATA.[SOLODATALINK] = [SOLODATALINK]
这样的话,结有点乱了哦,只能求出某一个产品,比如A的总和了。。。
大神,你原来的那句替换进去不行么
你原来的句子
(SELECT sum(datediff("d", startday, endday)) FROM TTL WHERE name=A.name) from ttl A
order by name,2
我替换成
(
SELECT SUM(DATEDIFF("D", UNDOSOLODATA.STARTDATE11, UNDOSOLODATA.ENDDATE11))
FROM
SOLODATA INNER JOIN UNDOSOLODATA ON SOLODATA.[SOLODATALINK] = UNDOSOLODATA.[SOLODATALINK] WHERE SOLODATA.TAGNUMBER<>""
) AS UNDOSOLODATA_ENDDATE11
FROM
(SOLODATA INNER JOIN UNDOSOLODATA ON SOLODATA.[SOLODATALINK] = UNDOSOLODATA.[SOLODATALINK]) WHERE SOLODATA.TAGNUMBER<>""
ORDER BY SOLODATA_TAGNUMBER, UNDOSOLODATA_TAGNUMBER DESC
但是我替换的不完整
我主要想问。。。name=A.name和ttl A这两句该怎么替换进去,因为我的name的格式是SOLODATA.TAGNUMBER,而且 定义A的地方也不知道该怎么写,一直有错
wwwwb 2012-09-27
  • 打赏
  • 举报
回复
SELECT SUM(DATEDIFF("D", UNDOSOLODATA.STARTDATE11, UNDOSOLODATA.ENDDATE11))
FROM
SOLODATA INNER JOIN UNDOSOLODATA ON SOLODATA.[SOLODATALINK] = UNDOSOLODATA.[SOLODATALINK] WHERE SOLODATA.TAGNUMBER<>""
这个应该是总和,不是每个日期的总和

SELECT SUM(DATEDIFF("D", UNDOSOLODATA.STARTDATE11, UNDOSOLODATA.ENDDATE11))
FROM UNDOSOLODATA WHERE SOLODATA.[SOLODATALINK] = [SOLODATALINK]
point_net 2012-09-27
  • 打赏
  • 举报
回复
额,这个地方的没你的源代码WHERE name=A.name) from ttl A这里我不知道怎么转换到我的代码里,怎么替换都有错
原句(SELECT sum(datediff("d", startday, endday)) FROM TTL WHERE name=A.name) from ttl A
对应替换
name=SOLODATA.TAGNUMBER
ttl=SOLODATA INNER JOIN UNDOSOLODATA ON SOLODATA.[SOLODATALINK] = UNDOSOLODATA.[SOLODATALINK]
startday=UNDOSOLODATA.STARTDATE11
endday=UNDOSOLODATA.ENDDATE11
替换后的句子
(
SELECT SUM(DATEDIFF("D", UNDOSOLODATA.STARTDATE11, UNDOSOLODATA.ENDDATE11))
FROM
SOLODATA INNER JOIN UNDOSOLODATA ON SOLODATA.[SOLODATALINK] = UNDOSOLODATA.[SOLODATALINK] WHERE SOLODATA.TAGNUMBER=A.TAGNUMBER AND SOLODATA.TAGNUMBER<>""
) AS UNDOSOLODATA_ENDDATE11
FROM
(SOLODATA INNER JOIN UNDOSOLODATA ON SOLODATA.[SOLODATALINK] = UNDOSOLODATA.[SOLODATALINK]) A WHERE SOLODATA.TAGNUMBER<>""
ORDER BY SOLODATA_TAGNUMBER, UNDOSOLODATA_TAGNUMBER DESC
WWWWA我这个地方是不是替换的不对啊???请帮忙看一下那个name=A.name和ttl A这两句我替换的对么?谢谢
point_net 2012-09-26
  • 打赏
  • 举报
回复
select name,'111',count(*),'','' from ttl group by name having count(*)>=2
union all
select name,nz(presentation,0),nz(datediff("d", startday, endday),0),'',
(SELECT sum(datediff("d", startday, endday)) FROM TTL WHERE name=A.name) from ttl A
order by name,2
这个代码中的WHERE name=A.name能不能去掉???我改成我的代码,这句加不上,麻烦你给看看怎么加,谢谢
相应转换
name=SOLODATA.TAGNUMBER
ttl=SOLODATA INNER JOIN UNDOSOLODATA ON SOLODATA.[SOLODATALINK] = UNDOSOLODATA.[SOLODATALINK]
startday=UNDOSOLODATA.STARTDATE11
endday=UNDOSOLODATA.ENDDATE11
我转换之后的代码
SELECT SOLODATA.TAGNUMBER AS SOLODATA_TAGNUMBER, Count(*) AS UNDOSOLODATA_TAGNUMBER,'' AS UNDOSOLODATA_REMARK11,'' AS UNDOSOLODATA_STARTDATE11,'' AS UNDOSOLODATA_ENDDATE11
FROM
SOLODATA INNER JOIN UNDOSOLODATA ON SOLODATA.[SOLODATALINK] = UNDOSOLODATA.[SOLODATALINK] WHERE SOLODATA.TAGNUMBER<>"" GROUP BY SOLODATA.TAGNUMBER HAVING Count(*)>=1
UNION ALL
SELECT SOLODATA.TAGNUMBER AS SOLODATA_TAGNUMBER,'' AS UNDOSOLODATA_TAGNUMBER, NZ(UNDOSOLODATA.REMARK11,'') AS UNDOSOLODATA_REMARK11,NZ(DATEDIFF("D", UNDOSOLODATA.STARTDATE11, UNDOSOLODATA.ENDDATE11),0) AS UNDOSOLODATA_STARTDATE11,
(
SELECT SUM(DATEDIFF("D", UNDOSOLODATA.STARTDATE11, UNDOSOLODATA.ENDDATE11))
FROM
SOLODATA INNER JOIN UNDOSOLODATA ON SOLODATA.[SOLODATALINK] = UNDOSOLODATA.[SOLODATALINK] WHERE SOLODATA.TAGNUMBER<>""
) AS UNDOSOLODATA_ENDDATE11
FROM
(SOLODATA INNER JOIN UNDOSOLODATA ON SOLODATA.[SOLODATALINK] = UNDOSOLODATA.[SOLODATALINK]) WHERE SOLODATA.TAGNUMBER<>""
ORDER BY SOLODATA_TAGNUMBER, UNDOSOLODATA_TAGNUMBER DESC
那句where不知道该怎么转换,怎么加进去。。。
我调整了下代码,显示正确了,但是日期总和能不能和产品数量在同一行呢?如果那句where加入不正确们是不是求不出来总和啊
谢谢
point_net 2012-09-26
  • 打赏
  • 举报
回复
好,我研究下
point_net 2012-09-26
  • 打赏
  • 举报
回复
为什么会有错啊
SELECT SOLODATA.TAGNUMBER,'111',Count(*),'',''
FROM SOLODATA INNER JOIN UNDOSOLODATA ON SOLODATA.[SOLODATALINK] = UNDOSOLODATA.[SOLODATALINK] WHERE SOLODATA.TAGNUMBER<>"" GROUP BY SOLODATA.TAGNUMBER HAVING Count(*)>=2
UNION ALL
SELECT SOLODATA.TAGNUMBER,,NZ(UNDOSOLODATA.REMARK11,0),'',NZ(DATEDIFF("D", UNDOSOLODATA.STARTDATE11, UNDOSOLODATA.ENDDATE11),0),
(SELECT SUM(DATEDIFF("D", UNDOSOLODATA.STARTDATE11, UNDOSOLODATA.ENDDATE11)) FROM SOLODATA INNER JOIN UNDOSOLODATA ON SOLODATA.[SOLODATALINK] = UNDOSOLODATA.[SOLODATALINK] WHERE SOLODATA.TAGNUMBER=A.TAGNUMBER) FROM (SOLODATA INNER JOIN UNDOSOLODATA ON SOLODATA.[SOLODATALINK] = UNDOSOLODATA.[SOLODATALINK]) A
ORDER BY SOLODATA.TAGNUMBER,2


name=SOLODATA.TAGNUMBER
ttl=SOLODATA INNER JOIN UNDOSOLODATA ON SOLODATA.[SOLODATALINK] = UNDOSOLODATA.[SOLODATALINK]
startday=UNDOSOLODATA.STARTDATE11
endday=UNDOSOLODATA.ENDDATE11
WWWWA 2012-09-26
  • 打赏
  • 举报
回复
基本思路就是这样了,自行修改,下班了,明日继续
WWWWA 2012-09-26
  • 打赏
  • 举报
回复
or




select name,'111',count(*),'','' from ttl group by name having count(*)>=2
union all
select name,nz(presentation,0),'',nz(datediff("d", startday, endday),0),
(SELECT sum(datediff("d", startday, endday)) FROM TTL WHERE name=A.name) from ttl A
order by name,2
WWWWA 2012-09-26
  • 打赏
  • 举报
回复
对,你要5列,多加1个空格即可




select name,'111',count(*),'','' from ttl group by name having count(*)>=2
union all
select name,nz(presentation,0),nz(datediff("d", startday, endday),0),'',
(SELECT sum(datediff("d", startday, endday)) FROM TTL WHERE name=A.name) from ttl A
order by name,2
point_net 2012-09-26
  • 打赏
  • 举报
回复
关键是不是要获得5个数据,然后在不同的文本框里是显示出来?你给的新代码,我在调试,不过我看了一些,貌似是4列。。。吧?
WWWWA 2012-09-26
  • 打赏
  • 举报
回复
将报表数据源设为此查询,格式自行调整一下
point_net 2012-09-26
  • 打赏
  • 举报
回复
ACCSEE有个显示,貌似就是报表,关键我获取不到这些数据,我试试新的,谢谢了哈
WWWWA 2012-09-26
  • 打赏
  • 举报
回复
呵呵,是这样

建议用代码 OR 报表显示这种格式;


select name,'111',count(*),'' from ttl group by name having count(*)>=2
union all
select name,nz(presentation,0),nz(datediff("d", startday, endday),0),
(SELECT sum(datediff("d", startday, endday)) FROM TTL WHERE name=A.name) from ttl A
order by name,2

7,714

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点。
社区管理员
  • Access
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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