当前位置: 代码迷 >> Sql Server >> 碰到个查询统计的sql,已经不会写了.help
  详细解决方案

碰到个查询统计的sql,已经不会写了.help

热度:103   发布时间:2016-04-24 09:39:37.0
遇到个查询统计的sql,已经不会写了...help
有几张表,需要做统计分析,如下:







现在要统计如下内容:
统计表:统计某个月内的完成情况,必须是完成的批次

批次 日期 原材料 领用量 入库数 消耗差  成本对比

批次,日期,就是生产情况信息表:A1中的内容;日期就是领用日期
原材料是几种原材料的明细列表,每种原材料独立一行,显示领用量
入库数是该批次在该日期的入库数量
消耗差是(实际消耗 - 标准消耗)
而实际消耗=该批次该物料领用量,标准消耗=经济模型中的该物料的每吨消耗量*该批次产品总入库数
成本对比=消耗差*经济模型中的该物料的标准单价

救命!我写不来了!大大!T_T


------解决思路----------------------
3表联查 其实就是3个表JOIN啊。涉及到一个行列转换的问题。你的原材料这些是固定的吗?如果是固定的,就直接写,不固定的话 需要用动态SQL
------解决思路----------------------
你的表可以整好看点吗~~~~你所勾勒出来的表貌似有问题啊~~~
你那个A1生产信息表中的仅有批次、领用日期??
还有你把B1和B2作成一个视图,把A1和A2作成一个视图,两两视图再关联可能会清晰点吧!!
以下是纯手打且未经测试的代码~~~~有点不太负责任的说。
仅供参考

--统计某月份的完成情况
select count(*) from 子表A1
where 是否完成=N'Y' and Month(日期)='某月'

--第二个问题
select c.批次,c.领用日期,c.领用数量,c.产品入库数,(c.领用数量 -  (d.每吨消耗量 * c.产品入库数)) as Consume,
((c.领用数量 -  (d.每吨消耗量 * c.产品入库数))*d.每吨价格) as Cost 
from
(select a.经济模型ID,a.批次,a.领用日期,b.原材料名称,b.领用数量,b.产品入库数 from A1 as a
left join A2 as b
on a.原材料名称=b.原材料名称) as c
left join B1 as d
on c.经济模型ID=d.ID
group by c.批次,c.领用日期,c.领用数量,c.产品入库数

------解决思路----------------------
不确定信息太多,你试下,有些东西我不知道你是怎么连接的,你要对上号
SELECT
T.批次
,T.领用日期[日期]
,C1.原材料名称[原材料]
,SUM(T.领用数量)[领用量]
,SUM(T.产品入库数)[入库数]
,SUM(T.领用数量)-SUM(T.产品入库数*B2.每顿消耗量)[消耗差]
,SUM(T.领用数量*B2.每顿价格)-SUM(T.产品入库数*B2.每顿消耗量*B2.每顿价格)[成本对比]
FROM
(SELECT A1.批次,A1.领用日期,A1.经济模型ID
,SUM(A2.领用数量)[领用数量]
,A1.产品入库数
,A2.ID
FROM A1
LEFT JOIN A2 ON A1.ID=A2.生产情况信息ID
GROUP BY A1.批次,A1.领用日期,A1.经济模型ID
,A1.产品入库数
,A2.ID
)T
LEFT JOIN B2 ON T.经济模型ID=B2.经济模型ID AND T.ID=B2.ID
LEFT JOIN C1 ON T.ID=C1.ID
GROUP BY
T.批次
,T.领用日期
,C1.原材料名称

------解决思路----------------------
A1Cte AS(
SELECT
id
,pici
,lydate
,jjmxid
,SUM(cprks)OVER(PARTITION BY pici)cprks
,MAX(ynend)OVER(PARTITION BY pici)ynend
FROM A1
--月份条件加在此处
)
SELECT
T.pici
,T.lydate[日期]
,C1.yclname[原材料]
,T.lynum[领用量]
,T.cprks[入库数]
,T.lynum[实际消耗]
,T.cprks*B2.XHB[标准消耗]
,ABS(T.lynum-T.cprks*B2.XHB)[消耗差]
,ABS(T.lynum*B2.price-T.cprks*B2.XHB*B2.price)[成本对比]
FROM
(SELECT T1.pici
,MAX(T1.lydate)lydate
,T1.jjmxid
,SUM(A2.lynum)[lynum]
,T1.cprks
,A2.yclid
FROM A1Cte T1
JOIN A2 ON T1.id=A2.aid
WHERE T1.ynend='Y'
GROUP BY T1.pici
,T1.jjmxid
,T1.cprks
,A2.yclid
)T
LEFT JOIN B2 ON T.jjmxid=B2.bid AND T.yclid=B2.yclid
LEFT JOIN C1 ON T.yclid=C1.id
试试这个
  相关解决方案