这个SQL存储过程有什么问题吗

insert into t_sclr(装配总数) select SUM(b.OUT_NUM) as 发货数量 from t_contract_order a left join T_CONTRACT_ORDER_DETAIL b
on a.sub_account_id=b.sub_account_id
where a.EXTEND50>='2016-11-12' and a.EXTEND50<='2017-1-12' and a.EXTEND1='博莱特工程'

执行结果如下:
警告: 聚合或其他 SET 操作消除了 Null 值。

(1 行受影响)

然后查询表:
查询结果

 求教大神

select ISNULL(T1.月份,T2.月份) as 月份,
装配总数,合同金额,装配成本,装配利润,装配利润率,
销售台数,开票金额,销售成本,销售利润,销售利润率
FROM
(
select cast(YEAR(EXTEND50) as nvarchar(4)) + '-' + cast(MONTH(EXTEND50) as nvarchar(2)) as 月份,
COUNT(sub_account_id) as 装配总数,
SUM(discount_money) as 合同金额 ,
SUM(EXTEND36) as 装配成本 ,
SUM(discount_money) / 1.17 - SUM(EXTEND36) as 装配利润 ,
(SUM(discount_money) / 1.17 - SUM(EXTEND36) ) / SUM(discount_money) as 装配利润率
from T_CONTRACT_ORDER
WHERE EXTEND1 = '装配工程单' AND EXTEND50 >= @KSRQ AND EXTEND50 <= @JSRQ
Group By cast(YEAR(EXTEND50) as nvarchar(4)) + '-' + cast(MONTH(EXTEND50) as nvarchar(2))
) T1
FULL OUTER JOIN
(
Select cast(YEAR(O.EXTEND50) as nvarchar(4)) + '-' + cast(MONTH(O.EXTEND50) as nvarchar(2)) as 月份,
SUM(D.INVOICED_NUM) as 销售台数,
SUM(O.INVOICED_MONEY) as 开票金额 ,
SUM(O.EXTEND36) as 销售成本 ,
SUM(O.INVOICED_MONEY) / 1.17 - SUM(O.EXTEND36) as 销售利润 ,
(SUM(O.INVOICED_MONEY) / 1.17 - SUM(O.EXTEND36) ) / SUM(O.INVOICED_MONEY) as 销售利润率
FROM T_CONTRACT_ORDER O INNER JOIN T_CONTRACT_ORDER_detail D ON O.sub_account_id = D.sub_account_id
where O.EXTEND50 >= @KSRQ AND O.EXTEND50 <= @JSRQ and O.EXTEND1 = '工程销售'
GROUP BY cast(YEAR(O.EXTEND50) as nvarchar(4)) + '-' + cast(MONTH(O.EXTEND50) as nvarchar(2))
) T2
ON T1.月份 = T2.月份

这是警告,不影响执行结果,就是提示你小心对NULL值的默认处理。

设计表时注意空值的处理方式,要不对NULL做计算会出问题,出现这个提示应该对列用ISNULL函数处理一下

insert into t_sclr(装配总数) select SUM(isnull(b.OUT_NUM,0)) as 发货数量 from t_contract_order a left join T_CONTRACT_ORDER_DETAIL b
on a.sub_account_id=b.sub_account_id
where a.EXTEND50>='2016-11-12' and a.EXTEND50<='2017-1-12' and a.EXTEND1='博莱特工程'

还是不行啊,并且在规定的月份之外还新增了个null。

 USE [UPCRM_SX]
GO
/****** Object:  StoredProcedure [dbo].[bb_sx_sclr]    Script Date: 12/10/2017 11:36:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[bb_sx_sclr]
       @KSRQ  varchar(20),
       @JSRQ  varchar(20)
AS
BEGIN

    DECLARE @DATE_S DATETIME,@DATE_E DATETIME --定义时间格式的日期变量
    DECLARE @DATE_TMP DATETIME --交换日期用的临时变量
    BEGIN TRY --开始校验输入是否合法
    SET @DATE_S =CONVERT(DATETIME,@KSRQ) --转换输入的字符串日期到时间格式的变量
    SET @DATE_E =CONVERT(DATETIME,@JSRQ) --转换输入的字符串日期到时间格式的变量
    IF @DATE_S>@DATE_E --如果开始日期大于结束日期,则交换,允许用户输入日期大小相反
BEGIN   
    SET @DATE_TMP=@DATE_S
    SET @DATE_S=@DATE_E
    SET @DATE_E=@DATE_TMP
END
END TRY
    BEGIN CATCH --错误处理,校验不通过则输出'0000-00'
    SELECT '0000-00' LIST
    RETURN 
END CATCH
    DECLARE @CHAR_MONTH VARCHAR(3)                  --定义月份的字符串临时变量
    drop table t_sclr
    create table t_sclr(
            月份        varchar(7),
            装配总数      varchar(20)

    )
 --比较条件:当前年份*12<=目标年和月份则继续
WHILE (DATEPART(YYYY,@DATE_S)*12+DATEPART(MM,@DATE_S)<=DATEPART(YYYY,@DATE_E)*12+DATEPART(MM,@DATE_E))
Begin
    SET @CHAR_MONTH=CONVERT(VARCHAR(2),DATEPART(MM,@DATE_S))        --转换当前月份的数据类型到字符串
    SET @CHAR_MONTH='0'+@CHAR_MONTH                                 --在月份前加“0”
    SET @CHAR_MONTH=SUBSTRING(@CHAR_MONTH,LEN(@CHAR_MONTH)-2+1,2)   --截取最后两位确保月份为1和2的时候其显示为01和02                                           

    INSERT INTO t_sclr(月份) VALUES(CONVERT(VARCHAR(4),DATEPART(YYYY,@DATE_S))+'-'+@CHAR_MONTH)
    SET @DATE_S=DATEADD(MM,1,@DATE_S)                               --当前月份+1
END 
SELECT 月份 FROM t_sclr ORDER BY 月份 ASC                  --按照先后顺序返回需要的结果列表



--2.装配总数    
insert into t_sclr(装配总数) select SUM(isnull(b.OUT_NUM,0)) as 发货数量 from t_contract_order a left join T_CONTRACT_ORDER_DETAIL b
on a.sub_account_id=b.sub_account_id
where a.EXTEND50>=@KSRQ and a.EXTEND50<=@JSRQ and a.EXTEND1='博莱特工程'


END

执行结果如下:
没有值

如果我单纯的只执行SQL语句,是有值的,我就想把这个值在存储过程中放到我建的新表里
图片说明

sum需要用group配合