Convert、Cast、Case When Else End、DateAdd实际运用

本文介绍了一种在SQLServer中根据当前时间查询康休中心班次的方法,通过使用复杂的SQL语句结合CAST、CONVERT及DATEADD函数实现跨天班次的准确匹配。

这个项目是一个康休中心项目的模块里的某个功能:

涉及的表:tb班次表

                  包括的字段:

1 fstrID nvarchar 50 0
0 fstr班次ID nvarchar 50 1
0 fstrStoreID nvarchar 10 1
0 fstr班次开始类型 tinyint 1 1
0 fstr班次开始时间 nvarchar 50 1
0 fstr班次开始小时 tinyint 1 1
0 fstr班次开始分钟 tinyint 1 1
0 fstr班次结束类型 tinyint 1 1
0 fstr班次结束时间 nvarchar 50 1
0 fstr班次结束小时 tinyint 1 1
0 fstr班次结束分钟 tinyint 1 1 

数据如下:

 

tb班次表数据

 fstrID fstr班次ID fstrStoreID fstr班次开始类型fstr班次开始时间  fstr班次开始小时 fstr班次开始分钟fstr班次结束类型 fstr班次结束时间  fstr班次结束小时 fstr班次结束分钟
 1 0 1 011:00  44 58 110:59  43 117
2 1 1 0 11:00 44 58 0 23:00 56 58
 3 2 1 0 14:00 47 58 1 1:00 34 58
 4 3 1 016:00  49 58 1 6:00 39 58

 

 

 

 

 

 

 

 

还有一个代码表:CodeCellection,存储日期等的代码,小时跟分钟都存储在代码表里,

包括字段:

1 CodeID int 4 0
0 CodeType nvarchar 100 1
0 CodeName nvarchar 200 1
0 CodeParentID int 4 1
0 CodeDescription nvarchar 500 1
0 CodeOrder tinyint 1 1

tb班次表涉及到小时、分的都只存储的是CodeCollection的CodeID字段值

语句功能描述:

康休中心包括4班,这里根据当前时间选择哪一班,这个是康休中心的人搞的需求,所以设计的不健全,
所以我们要判断它班次结束类型的1代表的是当天还是0代表的是当天,就产生了2条语句,最终是为了
取到符合的班次,这里逻辑不再做过多的介绍,主要看几个SQL Server函数的用法,我这里写的只是我
用到的,不是所有的都介绍:
Convert、Cast转换类型函数:
将某种数据类型的表达式显式转换为另一种数据类型。CAST 和 CONVERT 提供相似的功能。

语法

使用 CAST:

CAST ( expression AS data_type )

使用 CONVERT:

CONVERT (data_type[(length)], expression [, style])

参数

expression

是任何有效的 Microsoft® SQL Server™ 表达式。有关更多信息,请参见表达式

data_type

目标系统所提供的数据类型,包括 bigintsql_variant。不能使用用户定义的数据类型。有关可用的数据类型的更多信息,请参见数据类型

length

ncharnvarcharcharvarcharbinaryvarbinary 数据类型的可选参数。

style

日期格式样式,借以将 datetimesmalldatetime 数据转换为字符数据(ncharnvarcharcharvarcharncharnvarchar 数据类型);或者字符串格式样式,借以将 floatrealmoneysmallmoney 数据转换为字符数据(ncharnvarcharcharvarcharncharnvarchar 数据类型)。

SQL Server 支持使用科威特算法的阿拉伯样式中的数据格式。

在表中,左侧的两列表示将 datetimesmalldatetime 转换为字符数据的 style 值。给 style 值加 100,可获得包括世纪数位的四位年份 (yyyy)。

 

DATEADD

在向指定日期加上一段时间的基础上,返回新的 datetime 值。

语法

DATEADD ( datepart , number, date )

参数

datepart

是规定应向日期的哪一部分返回新值的参数。下表列出了 Microsoft® SQL Server™ 识别的日期部分和缩写。

日期部分缩写
Yearyy, yyyy
quarterqq, q
Monthmm, m
dayofyeardy, y
Daydd, d
Weekwk, ww
Hourhh
minutemi, n
secondss, s
millisecondms

number

是用来增加 datepart 的值。如果指定一个不是整数的值,则将废弃此值的小数部分。例如,如果为 datepart 指定 day,为 number 指定 1.75,则 date 将增加 1。

date

是返回 datetimesmalldatetime 值或日期格式字符串的表达式。有关指定日期的更多信息,请参见 datetime 和 smalldatetime

如果您只指定年份的最后两位数字,则小于或等于"两位数年份截止期"配置选项的值的最后两位数字的数字所在世纪与截止年所在世纪相同。大于该选项的值的最后两位数字的数字所在世纪为截止年所在世纪的前一个世纪。例如,如果 two digit year cutoff 为 2049(默认),则 49 被解释为 2049,2050 被解释为 1950。为避免模糊,请使用四位数的年份。

返回类型

返回 datetime,但如果 date 参数是 smalldatetime,返回 smalldatetime。

Case When else end 不再做过多解释,一看语句就会明白的

涉及到2个表

我当时根据查询结果判断,如果查询的recordCount=0 则就用另外一条语句,也就是说将1代表当天
换成0代表当天,或者将0代表当天换成1代表当天

--1代表当天
select tb班次.*,a.codename as fstr开始分钟,b.codename as fstr开始小时,c.codename as fstr结束分钟,d.codename as fstr结束小时  from tb班次 join codecollection a on (tb班次.fstr班次开始分钟 = a.codeid) join codecollection b on (tb班次.fstr班次开始小时 = b.codeid) join codecollection c on (tb班次.fstr班次结束分钟 = c.codeid) join codecollection d on (tb班次.fstr班次结束小时 = d.codeid)
where getdate() between
((case when fstr班次结束类型=1 then
   (dateadd(mi,cast(a.codename as tinyint),dateadd(hh,cast(b.codename as tinyint),cast(convert(varchar(10),dateadd(dd,-1,getdate()),101) as datetime))))
      else
 (dateadd(mi,cast(a.codename as tinyint),dateadd(hh,cast(b.codename as tinyint),cast(convert(varchar(10),getdate(),101) as datetime))))
 end
 )  )
    and
((dateadd(mi,cast(c.codename as tinyint),dateadd(hh,cast(d.codename as tinyint),cast(convert(varchar(10),getdate(),101) as datetime)))))
 
--0代表当天
select tb班次.*,a.codename as fstr开始分钟,b.codename as fstr开始小时,c.codename as fstr结束分钟,d.codename as fstr结束小时  from tb班次 join codecollection a on (tb班次.fstr班次开始分钟 = a.codeid) join codecollection b on (tb班次.fstr班次开始小时 = b.codeid) join codecollection c on (tb班次.fstr班次结束分钟 = c.codeid) join codecollection d on (tb班次.fstr班次结束小时 = d.codeid)
where getdate() between
(dateadd(mi,cast(a.codename as tinyint),dateadd(hh,cast(b.codename as tinyint),cast(convert(varchar(10),getdate(),101) as datetime))))
 and
((case when fstr班次结束类型=1 then
   (dateadd(mi,cast(c.codename as tinyint),dateadd(hh,cast(d.codename as tinyint),cast(convert(varchar(10),dateadd(dd,1,getdate()),101) as datetime))))
      else
 (dateadd(mi,cast(c.codename as tinyint),dateadd(hh,cast(d.codename as tinyint),cast(convert(varchar(10),dateadd(dd,1,getdate()),101) as datetime))))
 end
 )  ) 

WITH 年份范围 AS ( SELECT '2022' AS 年份, '年度' AS 类型 UNION ALL SELECT '2023', '年度' UNION ALL SELECT '2024', '年度' UNION ALL SELECT '2025', '月度' ), 年月序列 AS ( SELECT CASE WHEN 类型 = '年度' THEN 年份 + '-12' -- 年度数据标记为12月 ELSE CONVERT(VARCHAR(7), DATEADD(MONTH, num-1, CAST(年份+'-01-01' AS DATE)), 120) END AS 年月, 类型 FROM 年份范围 CROSS JOIN ( SELECT 1 AS num UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12 ) months WHERE (类型 = '年度' AND num = 1) OR 类型 = '月度' -- 年度只取1条 ), 报废汇总 AS ( SELECT CASE WHEN YEAR(日期) IN (2022,2023,2024) THEN CONVERT(CHAR(4), YEAR(日期)) + '-12' ELSE CONVERT(VARCHAR(7), 日期, 120) END AS 年月, ISNULL(报废原因, '材料不良-缸体毛坯(铸造加工不良)') AS 报废原因, SUM(CONVERT(INT, 数量)) AS 数量 FROM [dbo].[V_报废不良] WHERE 生产线 = '缸体' AND 报废原因 LIKE '材料不良%' AND 产线 = 'TNGA12' AND YEAR(日期) BETWEEN 2022 AND 2025 GROUP BY CASE WHEN YEAR(日期) IN (2022,2023,2024) THEN CONVERT(CHAR(4), YEAR(日期)) + '-12' ELSE CONVERT(VARCHAR(7), 日期, 120) END, 报废原因 ), 生产实绩 AS ( SELECT CASE WHEN YEAR(日期) IN (2022,2023,2024) THEN CONVERT(CHAR(4), YEAR(日期)) + '-12' ELSE LEFT(REPLACE(日期, '/', '-'), 7) END AS 年月, SUM(实绩) AS 实绩 FROM 现场DB.dbo.V_加工线每月生产台数 WHERE 线别 = '缸体' AND YEAR(日期) BETWEEN 2022 AND 2025 GROUP BY CASE WHEN YEAR(日期) IN (2022,2023,2024) THEN CONVERT(CHAR(4), YEAR(日期)) + '-12' ELSE LEFT(REPLACE(日期, '/', '-'), 7) END ), 历史不良数据 AS ( SELECT CASE WHEN LEFT(年月, 4) IN ('2022','2023','2024') THEN LEFT(年月, 4) + '-12' ELSE 年月 END AS 年月, MIN(不良率目标) AS 目标 FROM [dbo].[dwd_加工线报废返修不良] WHERE 类型 = '材料不良' AND 线组 = '缸体' AND LEFT(年月, 4) IN ('2022','2023','2024','2025') GROUP BY CASE WHEN LEFT(年月, 4) IN ('2022','2023','2024') THEN LEFT(年月, 4) + '-12' ELSE 年月 END ) SELECT y.年月, CASE WHEN y.类型 = '年度' THEN '年度汇总' ELSE ISNULL(f.报废原因, '材料不良-缸体毛坯(铸造加工不良)') END AS 报废原因, COALESCE(f.数量, 0) AS 数量, COALESCE(p.实绩, 0) AS 实绩, ROUND( CASE WHEN COALESCE(p.实绩, 0) > 0 THEN CONVERT(FLOAT, COALESCE(f.数量, 0)) / CONVERT(FLOAT, p.实绩) * 100 ELSE 0 END, 4 ) AS 不良率, COALESCE(h.目标, 0.5) AS 目标, y.类型 -- 标识数据粒度 FROM 年月序列 y LEFT JOIN 报废汇总 f ON y.年月 = f.年月 LEFT JOIN 生产实绩 p ON y.年月 = p.年月 LEFT JOIN 历史不良数据 h ON y.年月 = h.年月 ORDER BY CASE WHEN y.类型 = '年度' THEN 0 ELSE 1 END, -- 年度在前 y.年月 DESC; 报错从字符串转换日期和/或时间时,转换失败,优化语句
07-12
WITH DateRange AS ( SELECT 台账状态, 生产线, 工单号, 设备编号, 内容与方法, 点检项目, 基准值, 定期时长, 单位, 下次点检日期, CASE WHEN 单位 = '天' THEN 定期时长 WHEN 单位 = '月' THEN DATEDIFF(DAY, 下次点检日期, DATEADD(MONTH, 定期时长, 下次点检日期)) END AS 周期天数 FROM [dbo].[dwd_设备_定期台账一览] WHERE 生产线 IN ('缸体_TNGA1线', '缸体_TNGA2线') AND YEAR(下次点检日期) >= 2025 AND 作业部门 = '现场' AND 台账状态 = '启用' ), FutureInspections AS ( SELECT *, CASE -- 当定期时长为1天时,直接使用下次点检日期 WHEN 定期时长 = 1 AND 单位 = '天' THEN 下次点检日期 -- 否则计算未来点检日期 ELSE DATEADD(DAY, 周期天数 * (n-1), 下次点检日期) END AS 预计点检日期 FROM DateRange CROSS APPLY ( -- 动态生成序列号:1天周期只生成1个,其他生成53个 SELECT TOP (CASE WHEN 定期时长 = 1 AND 单位 = '天' THEN 1 ELSE 53 END) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS n FROM sys.all_objects ) AS Numbers ) SELECT * FROM ( SELECT 生产线, 工单号, 设备编号, 内容与方法, 点检项目, 基准值, 单位, 定期时长, 周期天数, CONVERT(date, 下次点检日期) AS 下次点检日期, CONVERT(date, 预计点检日期) AS 预计点检日期, DATEDIFF(DAY, GETDATE(), 预计点检日期) AS 距离下次点检天数 FROM FutureInspections ) AS SubQuery WHERE 1=1 ${if(len(工单号)==0,"","and 工单号 in ('" +工单号+ "')")} and YEAR(预计点检日期) = YEAR(GETDATE()) 统计以上的预计点检日期个按照月份区分,然后汇总以下语句到以下计划数中 SELECT 月份, SUM(总数量) AS 计划数, SUM(实施数量) AS 实施数量, SUM(已完成数量) AS 已完成, CAST( CASE WHEN SUM(总数量) > 0 THEN 1.0 * SUM(实施数量) / SUM(总数量) ELSE 0 END AS DECIMAL(10,2) ) AS 实施率, CAST( CASE WHEN SUM(总数量) > 0 THEN 1.0 * SUM(已完成数量) / SUM(总数量) ELSE 0 END AS DECIMAL(10,2) ) AS 完成率 FROM ( SELECT b.年月 AS 月份, COUNT(作业状态) AS 总数量, SUM(CASE WHEN 作业状态 = '已完成' THEN 1 ELSE 0 END) AS 实施数量, SUM(CASE WHEN 作业状态 = '已完成' THEN 1 ELSE 0 END) AS 已完成数量 FROM [dbo].[V_CurrentYearMonths] b LEFT JOIN [dbo].[dwd_设备_点检单一览] a ON b.年月 = FORMAT(a.实际完成日期, 'yyyy-MM') AND a.实际完成日期 IS NOT NULL AND a.生产线 IN ('缸体_TNGA1线', '缸体_TNGA2线') AND YEAR(a.实际完成日期) >= 2025 AND a.实施部门 = '现场' WHERE b.生产线 = '缸体' GROUP BY b.年月 UNION ALL SELECT b.年月 AS 月份, COUNT(作业状态) AS 总数量, SUM(CASE WHEN 作业状态 IN ('已完成','实施中','确认中') THEN 1 ELSE 0 END) AS 实施数量, SUM(CASE WHEN 作业状态 = '已完成' THEN 1 ELSE 0 END) AS 已完成数量 FROM [dbo].[V_CurrentYearMonths] b LEFT JOIN [dbo].[dwd_TPM实施] a ON b.年月 = FORMAT(a.应点检日期, 'yyyy-MM') AND a.生产线 IN ('缸体_TNGA1线', '缸体_TNGA2线') AND YEAR(a.应点检日期) >= 2025 AND a.应点检日期 < CONVERT(VARCHAR(10), GETDATE(), 120) WHERE b.生产线 = '缸体' GROUP BY b.年月 ) combined GROUP BY 月份 ORDER BY 月份 ASC
08-05
Set NoCount On SET ANSI_WARNINGS OFF Create Table #Happen2( FItemID int Null, FStockID int Null, FBatchNo NVARCHAR(200), FQty decimal(28,10) Null, FCUUnitQty decimal(28,10) Null, FQty1 Decimal(28,10), FCUUnitQty1 Decimal(28,10), FAmount1 Decimal(28,10), FQty2 Decimal(28,10), FCUUnitQty2 Decimal(28,10), FAmount2 Decimal(28,10), FQty3 Decimal(28,10), FCUUnitQty3 Decimal(28,10), FAmount3 Decimal(28,10), FQty4 Decimal(28,10), FCUUnitQty4 Decimal(28,10), FAmount4 Decimal(28,10), FQty5 Decimal(28,10), FCUUnitQty5 Decimal(28,10), FAmount5 Decimal(28,10), FQty6 Decimal(28,10), FCUUnitQty6 Decimal(28,10), FAmount6 Decimal(28,10), FTemp bit ,FPrice Decimal(28,10),FCUPrice Decimal(28,10),FAmount Decimal(28,10)) Create Table #Happen( FItemID int Null, FStockID int Null, FBatchNo NVARCHAR(200), FQty decimal(28,10) Null, FCUUnitQty decimal(28,10) Null, FQty1 Decimal(28,10), FCUUnitQty1 Decimal(28,10), FAmount1 Decimal(28,10), FQty2 Decimal(28,10), FCUUnitQty2 Decimal(28,10), FAmount2 Decimal(28,10), FQty3 Decimal(28,10), FCUUnitQty3 Decimal(28,10), FAmount3 Decimal(28,10), FQty4 Decimal(28,10), FCUUnitQty4 Decimal(28,10), FAmount4 Decimal(28,10), FQty5 Decimal(28,10), FCUUnitQty5 Decimal(28,10), FAmount5 Decimal(28,10), FQty6 Decimal(28,10), FCUUnitQty6 Decimal(28,10), FAmount6 Decimal(28,10), FTemp bit ,FPrice Decimal(28,10),FCUPrice Decimal(28,10),FAmount Decimal(28,10)) Create Table #Happen1( FItemID int Null, FStockID int Null, FBatchNo NVARCHAR(200), FQty decimal(28,10) Null, FCUUnitQty decimal(28,10) Null, FQty1 Decimal(28,10), FCUUnitQty1 Decimal(28,10), FQty2 Decimal(28,10), FCUUnitQty2 Decimal(28,10), FQty3 Decimal(28,10), FCUUnitQty3 Decimal(28,10), FQty4 Decimal(28,10), FCUUnitQty4 Decimal(28,10), FQty5 Decimal(28,10), FCUUnitQty5 Decimal(28,10), FQty6 Decimal(28,10), FCUUnitQty6 Decimal(28,10), FTemp bit ,FPrice Decimal(28,10),FCUPrice Decimal(28,10),FAmount Decimal(28,10) ) Insert Into #Happen1 Select t1.FItemID,t2.FItemID As FStockID,t6.FBatchNo,0,0, (Case When t5.FDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-29,Getdate()),101)) And t5.FDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-0,Getdate()),101)) Then t5.FRob*t6.FQty Else 0 End) As FQty1, ((Case When t5.FDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-29,Getdate()),101)) And t5.FDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-0,Getdate()),101)) Then CAST(t5.FRob*t6.FQty AS DECIMAL(28,10)) Else 0 End))/t7.FCoefficient As FCUUnitQty1, (Case When t5.FDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-59,Getdate()),101)) And t5.FDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-30,Getdate()),101)) Then t5.FRob*t6.FQty Else 0 End) As FQty2, ((Case When t5.FDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-59,Getdate()),101)) And t5.FDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-30,Getdate()),101)) Then CAST(t5.FRob*t6.FQty AS DECIMAL(28,10)) Else 0 End))/t7.FCoefficient As FCUUnitQty2, (Case When t5.FDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-89,Getdate()),101)) And t5.FDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-60,Getdate()),101)) Then t5.FRob*t6.FQty Else 0 End) As FQty3, ((Case When t5.FDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-89,Getdate()),101)) And t5.FDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-60,Getdate()),101)) Then CAST(t5.FRob*t6.FQty AS DECIMAL(28,10)) Else 0 End))/t7.FCoefficient As FCUUnitQty3, (Case When t5.FDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-179,Getdate()),101)) And t5.FDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-90,Getdate()),101)) Then t5.FRob*t6.FQty Else 0 End) As FQty4, ((Case When t5.FDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-179,Getdate()),101)) And t5.FDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-90,Getdate()),101)) Then CAST(t5.FRob*t6.FQty AS DECIMAL(28,10)) Else 0 End))/t7.FCoefficient As FCUUnitQty4, (Case When t5.FDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-359,Getdate()),101)) And t5.FDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-180,Getdate()),101)) Then t5.FRob*t6.FQty Else 0 End) As FQty5, ((Case When t5.FDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-359,Getdate()),101)) And t5.FDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-180,Getdate()),101)) Then CAST(t5.FRob*t6.FQty AS DECIMAL(28,10)) Else 0 End))/t7.FCoefficient As FCUUnitQty5, (Case When t5.FDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-360,Getdate()),101)) And t5.FDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-360,Getdate()),101)) Then t5.FRob*t6.FQty Else 0 End) As FQty6, ((Case When t5.FDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-360,Getdate()),101)) And t5.FDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-360,Getdate()),101)) Then CAST(t5.FRob*t6.FQty AS DECIMAL(28,10)) Else 0 End))/t7.FCoefficient As FCUUnitQty6, 1 ,ISNULL(((SELECT t12.FBegBal/t12.FBegQty FROM t_ICItem t11 INNER JOIN (SELECT FItemID,SUM(FBegBal) AS FBegBal,SUM(FBegQty) AS FBegQty FROM ICBal t13 Where t13.FItemID = t6.FItemID And t13.FYear = (select FValue from t_SystemProfile where FCategory='IC' and FKey='CurrentYear') And t13.FPeriod = (select FValue from t_SystemProfile where FCategory='IC' and FKey='CurrentPeriod')--And t13.FYear = 2017 And t13.FPeriod = 10 GROUP BY t13.FItemID) t12 ON t11.FItemID=t12.FItemID AND t12.FBegBal>0 AND t12.FBegQty>0) ),0),0,0 From t_ICItem t1 Join ICStockBill t5 On (t5.FStatus > 0 Or (t5.FUpStockWhenSave > 0 And t5.FCancellation <1 join="" icstockbillentry="" t6="" on="" t5="" finterid="t6.FInterID" left="" join="" t_measureunit="" t7="" on="" t1="" fstoreunitid="t7.FMeasureUnitID" left="" join="" t_stock="" t2="" on="" t2="" fitemid="(case" when="" t5="" ftrantype="24" then="" t6="" fscstockid="" else="" t6="" fdcstockid="" end="" where="" t1="" fitemid="t6.FItemID" and="" t5="" ftrantype="" in="" 1="" 2="" 5="" 10="" 40="" and="" t5="" frob="1)" or="" t5="" ftrantype="" in="" 21="" 24="" 28="" 29="" and="" t5="" frob="-1))" and="" not="" t5="" ftrantype="" in="" 1="" and="" t5="" fpomode="36681" and="" not="" t5="" ftrantype="1" and="" t6="" fsourceinterid=""> 0 and EXISTS(SELECT 1 FROM ICHookRelations t8 where t6.FinterID=t8.fIBInterID and t8.FIBTag=4 ))) And t2.FTypeID NOT IN (504)--And t1.FNumber='041-017981-00' And t1. FNumber='041-017981-00' --如果要限定物料编码,可以启用此条件 AND t1.FDeleted=0 Insert Into #Happen1 Select t1.FItemID,t2.FItemID As FStockID,t6.FBatchNo,0,0, (Case When t6.FStockInDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-29,Getdate()),101)) And t6.FStockInDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-0,Getdate()),101)) Then t6.FBegQty Else 0 End) As FQty1, ((Case When t6.FStockInDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-29,Getdate()),101)) And t6.FStockInDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-0,Getdate()),101)) Then t6.FBegQty Else 0 End))/t7.FCoefficient As FCUUnitQty1, (Case When t6.FStockInDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-59,Getdate()),101)) And t6.FStockInDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-30,Getdate()),101)) Then t6.FBegQty Else 0 End) As FQty2, ((Case When t6.FStockInDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-59,Getdate()),101)) And t6.FStockInDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-30,Getdate()),101)) Then t6.FBegQty Else 0 End))/t7.FCoefficient As FCUUnitQty2, (Case When t6.FStockInDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-89,Getdate()),101)) And t6.FStockInDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-60,Getdate()),101)) Then t6.FBegQty Else 0 End) As FQty3, ((Case When t6.FStockInDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-89,Getdate()),101)) And t6.FStockInDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-60,Getdate()),101)) Then t6.FBegQty Else 0 End))/t7.FCoefficient As FCUUnitQty3, (Case When t6.FStockInDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-179,Getdate()),101)) And t6.FStockInDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-90,Getdate()),101)) Then t6.FBegQty Else 0 End) As FQty4, ((Case When t6.FStockInDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-179,Getdate()),101)) And t6.FStockInDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-90,Getdate()),101)) Then t6.FBegQty Else 0 End))/t7.FCoefficient As FCUUnitQty4, (Case When t6.FStockInDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-359,Getdate()),101)) And t6.FStockInDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-180,Getdate()),101)) Then t6.FBegQty Else 0 End) As FQty5, ((Case When t6.FStockInDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-359,Getdate()),101)) And t6.FStockInDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-180,Getdate()),101)) Then t6.FBegQty Else 0 End))/t7.FCoefficient As FCUUnitQty5, (Case When t6.FStockInDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-360,Getdate()),101)) And t6.FStockInDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-360,Getdate()),101)) Then t6.FBegQty Else 0 End) As FQty6, ((Case When t6.FStockInDate>=Convert(DateTime,Convert(Varchar,DATEADD(dd,-360,Getdate()),101)) And t6.FStockInDate<=Convert(DateTime,Convert(Varchar,DATEADD(dd,-360,Getdate()),101)) Then t6.FBegQty Else 0 End))/t7.FCoefficient As FCUUnitQty6, 1 ,ISNULL(((SELECT t12.FBegBal/t12.FBegQty FROM t_ICItem t11 INNER JOIN (SELECT FItemID,SUM(FBegBal) AS FBegBal,SUM(FBegQty) AS FBegQty FROM ICBal t13 Where t13.FItemID = t6.FItemID And t13.FYear = (select FValue from t_SystemProfile where FCategory='IC' and FKey='CurrentYear') And t13.FPeriod = (select FValue from t_SystemProfile where FCategory='IC' and FKey='CurrentPeriod')--And t13.FYear = 2017 And t13.FPeriod = 10 GROUP BY t13.FItemID) t12 ON t11.FItemID=t12.FItemID AND t12.FBegBal>0 AND t12.FBegQty>0) ),0),0,0 From t_ICItem t1 Join ICInvInitial t6 On t1.FItemID = t6.FItemID Left Join t_MeasureUnit t7 On t1.FStoreUnitID=t7.FMeasureUnitID Left Join t_Stock t2 On t2.FItemID = t6.FStockID Where 1=1 And t2.FTypeID NOT IN (504)--And t1.FNumber='041-017981-00' And t1. FNumber='041-017981-00' --如果要限定物料编码,可以启用此条件 AND t1.FDeleted=0 Insert Into #Happen1 Select t1.FItemID,t2.FItemID As FStockID,t3.FBatchNo,(t3.FQTY) As FQTY,CAST(t3.FQTY AS DECIMAL(28,10))/t7.FCoefficient As FCUUnitQty,0,0,0,0,0,0,0,0,0,0,0,0,1 ,ISNULL(((SELECT t12.FBegBal/t12.FBegQty FROM t_ICItem t11 INNER JOIN (SELECT FItemID,SUM(FBegBal) AS FBegBal,SUM(FBegQty) AS FBegQty FROM ICBal t13 Where t13.FItemID = t3.FItemID And t13.FYear = (select FValue from t_SystemProfile where FCategory='IC' and FKey='CurrentYear') And t13.FPeriod = (select FValue from t_SystemProfile where FCategory='IC' and FKey='CurrentPeriod')--And t13.FYear = 2017 And t13.FPeriod = 10 GROUP BY t13.FItemID) t12 ON t11.FItemID=t12.FItemID AND t12.FBegBal>0 AND t12.FBegQty>0) ),0),0,0 From t_ICItem t1 Join ICINVENTORY t3 On t1.FItemID = t3.FItemID Left Join t_MeasureUnit t7 On t1.FStoreUnitID=t7.FMeasureUnitID Left Join t_Stock t2 On t2.FItemID = t3.FStockID Where 1=1 And t2.FTypeID NOT IN (504)--And t1.FNumber='041-017981-00' And t1. FNumber='041-017981-00' --如果要限定物料编码,可以启用此条件 AND t1.FDeleted=0 Insert Into #HAPPEN2 Select t1.FITEMID,0,t1.FBatchNo,Sum(FQTY)As FQTY,Sum(FCUUnitQTY)As FCUUnitQTY, Sum(fqty1) As FQty1 ,Sum(fCUUnitqty1) As FCUUnitQty1 ,0,Sum(fqty2) As FQty2 ,Sum(fCUUnitqty2) As FCUUnitQty2 ,0,Sum(fqty3) As FQty3 ,Sum(fCUUnitqty3) As FCUUnitQty3 ,0,Sum(fqty4) As FQty4 ,Sum(fCUUnitqty4) As FCUUnitQty4 ,0,Sum(fqty5) As FQty5 ,Sum(fCUUnitqty5) As FCUUnitQty5 ,0,Sum(fqty6) As FQty6 ,Sum(fCUUnitqty6) As FCUUnitQty6 ,0,1,Min(FPrice),case Sum(FCUUnitQTY) when 0 then 0 else (Min(FPrice)*Sum(FQTY))/Sum(FCUUnitQTY) end,Min(FPrice)*Sum(FQTY) From #HAPPEN1 t1 INNER JOIN t_ICItem t2 ON t1.FItemID=t2.FItemID GROUP By t1.FITEMID,t1.FBatchNo Update #Happen2 Set FQty1= FQty,FQty2=0 ,FQty3=0 ,FQty4=0 ,FQty5=0 ,FQty6=0 Where FQty-FQty1<0 Update #Happen2 Set FQty2= FQty-FQty1,FQty3=0 ,FQty4=0 ,FQty5=0 ,FQty6=0 Where FQty-FQty1-FQty2<0 Update #Happen2 Set FQty3= FQty-FQty1-FQty2,FQty4=0 ,FQty5=0 ,FQty6=0 Where FQty-FQty1-FQty2-FQty3<0 Update #Happen2 Set FQty4= FQty-FQty1-FQty2-FQty3,FQty5=0 ,FQty6=0 Where FQty-FQty1-FQty2-FQty3-FQty4<0 Update #Happen2 Set FQty5= FQty-FQty1-FQty2-FQty3-FQty4,FQty6=0 Where FQty-FQty1-FQty2-FQty3-FQty4-FQty5<0 Update #Happen2 Set FQty6= FQty-FQty1-FQty2-FQty3-FQty4-FQty5 Update #Happen2 Set FAmount1=FPrice*FQty1 Update #Happen2 Set FAmount2=FPrice*FQty2 Update #Happen2 Set FAmount3=FPrice*FQty3 Update #Happen2 Set FAmount4=FPrice*FQty4 Update #Happen2 Set FAmount5=FPrice*FQty5 Update #Happen2 Set FAmount6=FPrice*FQty6 Update #Happen2 Set FCUUnitQty1= FCUUnitQty,FCUUnitQty2=0 ,FCUUnitQty3=0 ,FCUUnitQty4=0 ,FCUUnitQty5=0 ,FCUUnitQty6=0 Where FCUUnitQty-FCUUnitQty1<0 Update #Happen2 Set FCUUnitQty2= FCUUnitQty-FCUUnitQty1 ,FCUUnitQty3=0 ,FCUUnitQty4=0 ,FCUUnitQty5=0 ,FCUUnitQty6=0 Where FCUUnitQty-FCUUnitQty1-FCUUnitQty2<0 Update #Happen2 Set FCUUnitQty3= FCUUnitQty-FCUUnitQty1 -FCUUnitQty2 ,FCUUnitQty4=0 ,FCUUnitQty5=0 ,FCUUnitQty6=0 Where FCUUnitQty-FCUUnitQty1-FCUUnitQty2-FCUUnitQty3<0 Update #Happen2 Set FCUUnitQty4= FCUUnitQty-FCUUnitQty1 -FCUUnitQty2 -FCUUnitQty3 ,FCUUnitQty5=0 ,FCUUnitQty6=0 Where FCUUnitQty-FCUUnitQty1-FCUUnitQty2-FCUUnitQty3-FCUUnitQty4<0 Update #Happen2 Set FCUUnitQty5= FCUUnitQty-FCUUnitQty1 -FCUUnitQty2 -FCUUnitQty3 -FCUUnitQty4 ,FCUUnitQty6=0 Where FCUUnitQty-FCUUnitQty1-FCUUnitQty2-FCUUnitQty3-FCUUnitQty4-FCUUnitQty5<0 update="" happen2="" set="" fcuunitqty6="FCUUnitQty-FCUUnitQty1" -fcuunitqty2="" -fcuunitqty3="" -fcuunitqty4="" -fcuunitqty5="" insert="" into="" happen="" select="" t1="" fitemid="" 0="" t1="" fbatchno="" sum="" fqty="" as="" fqty="" sum="" fcuunitqty="" as="" fcuunitqty="" sum="" fqty1="" as="" fqty1="" sum="" fcuunitqty1="" as="" fcuunitqty1="" sum="" famount1="" as="" famount1="" sum="" fqty2="" as="" fqty2="" sum="" fcuunitqty2="" as="" fcuunitqty2="" sum="" famount2="" as="" famount2="" sum="" fqty3="" as="" fqty3="" sum="" fcuunitqty3="" as="" fcuunitqty3="" sum="" famount3="" as="" famount3="" sum="" fqty4="" as="" fqty4="" sum="" fcuunitqty4="" as="" fcuunitqty4="" sum="" famount4="" as="" famount4="" sum="" fqty5="" as="" fqty5="" sum="" fcuunitqty5="" as="" fcuunitqty5="" sum="" famount5="" as="" famount5="" sum="" fqty6="" as="" fqty6="" sum="" fcuunitqty6="" as="" fcuunitqty6="" sum="" famount6="" as="" famount6="" 1="" min="" fprice="" case="" sum="" fcuunitqty="" when="" 0="" then="" 0="" else="" min="" fprice="" sum="" fqty="" sum="" fcuunitqty="" end="" min="" fprice="" sum="" fqty="" from="" happen2="" t1="" inner="" join="" t_icitem="" t2="" on="" t1="" fitemid="t2.FItemID" group="" by="" t1="" fitemid="" t1="" fbatchno="" having="" sum="" fqty="">=0) CREATE TABLE #DATA( FNumber Varchar(355) null, FShortNumber Varchar(355) null, FName Varchar(355) null, FModel Varchar(355) null, FUnitName Varchar(355) null, FCUUnitName Varchar(355) null, FQtyDecimal smallint null, FPriceDecimal smallint null, FQty Decimal(28,10) Null, FCUUnitQty Decimal(28,10) Null, FPrice Decimal(28,10) NULL, FCUPrice Decimal(28,10) Null, FAmount Decimal(28,10) Null, FQty1 Decimal(28,10), FCUUnitQty1 Decimal(28,10), FAmount1 Decimal(28,10), FQty2 Decimal(28,10), FCUUnitQty2 Decimal(28,10), FAmount2 Decimal(28,10), FQty3 Decimal(28,10), FCUUnitQty3 Decimal(28,10), FAmount3 Decimal(28,10), FQty4 Decimal(28,10), FCUUnitQty4 Decimal(28,10), FAmount4 Decimal(28,10), FQty5 Decimal(28,10), FCUUnitQty5 Decimal(28,10), FAmount5 Decimal(28,10), FQty6 Decimal(28,10), FCUUnitQty6 Decimal(28,10), FAmount6 Decimal(28,10), FSumSort smallint not null Default(0), Flevel0 Decimal(10,3), Flevel1 Decimal(10,3), Flevel2 Decimal(10,3), Flevel3 Decimal(10,3), Flevel4 Decimal(10,3), Flevel5 Decimal(10,3), Flevel6 Decimal(10,3), FID int IDENTITY) INSERT INTO #DATA ( FNumber,FShortNumber,FName,FModel,FUnitName,FCUUnitName, FQtyDecimal,FPriceDecimal,FQty,FCUUnitQty,FPrice,FCUPrice,FAmount,FQty1, FCUUnitQty1, FAmount1, FQty2, FCUUnitQty2, FAmount2, FQty3, FCUUnitQty3, FAmount3, FQty4, FCUUnitQty4, FAmount4, FQty5, FCUUnitQty5, FAmount5, FQty6, FCUUnitQty6, FAmount6, FSumSort) SELECT CASE WHEN GROUPING(t1.FNumber)=1 THEN '合计' ELSE t1.FNumber END, '','','','','',MAX(t1.FQtyDecimal),MAX(t1.FPriceDecimal),Sum(FQty),Sum(FCUUnitQty), case Sum(FQty) when 0 then 0 else Sum(FAmount)/Sum(FQty) end,(CASE Sum(FCUUnitQty) WHEN 0 THEN 0 ELSE Sum(FAmount)/Sum(FCUUnitQty) END), sum(FAmount), SUM(FQty1), SUM(FCUUnitQty1), SUM(FAmount1), SUM(FQty2), SUM(FCUUnitQty2), SUM(FAmount2), SUM(FQty3), SUM(FCUUnitQty3), SUM(FAmount3), SUM(FQty4), SUM(FCUUnitQty4), SUM(FAmount4), SUM(FQty5), SUM(FCUUnitQty5), SUM(FAmount5), SUM(FQty6), SUM(FCUUnitQty6), SUM(FAmount6), CASE WHEN GROUPING(t1.FNumber)=1 THEN 101 ELSE 0 END FROM #Happen v2 Inner Join t_ICItem t1 On v2.FItemID=t1.FItemID Left Join t_Stock t2 On v2.FStockID=t2.FItemID Where 1=1 Group by t1.FNumber WITH ROLLUP Having Sum(FQty)>0 Update t1 Set t1.FName=t2.FName,t1.FShortNumber=t2.FShortNumber,t1.FModel=t2.FModel, t1.FUnitName=t3.FName,t1.FCUUnitName=t4.FName ,t1.FQtyDecimal=t2.FQtyDecimal,t1.FPriceDecimal=t2.FPriceDecimal From #DATA t1,t_ICItem t2,t_MeasureUnit t3,t_MeasureUnit t4 Where t1.FNumber=t2.FNumber And t2.FUnitGroupID=t3.FUnitGroupID And t2.FStoreUnitID=t4.FMeasureUnitID And t3.FStandard=1 SELECT FNumber 物料编码,FName 物料名称,FUnitName 基本计量单位,FCUUnitName 库存单位,FQty 库存数量,FPrice 单价,FAmount 金额, Fqty1 '0-29天数量',fAmount1 '0-29天金额',Fqty2 '30-59天数量',fAmount2 '30-59天金额',Fqty3 '60-89天数量',fAmount3 '60-89天金额',Fqty4 '90-179天数量',fAmount4 '90-179天金额',Fqty5 '180-359天数量',fAmount5 '180-359天金额',Fqty6 '360天以上数量',fAmount6 '360天以上金额' FROM #DATA DROP TABLE #DATA Drop Table #Happen Drop Table #Happen1 Drop Table #Happen2 提示列名 'FPOMode' 无效。
07-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值