求ky_min师傅进来下 发现SQL 统计的不对

lu仙深 2014-11-05 08:51:06
求ky_min师傅进来下 发现SQL 统计的不对



例如2号出库单号 6月5日出库 6月8日收款 5000元 这个其中的3天应该是*利息率= 15元啊
2号出库单号 6月5日出库 6月10日收款 4000元 他们之前的天数是2天5K * 利率 5元
2号出库单号 6月5日出库 还有1000没有付款,只能估算到今天的利息 XX元

原帖

http://bbs.csdn.net/topics/390921870
...全文
216 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
lu仙深 2014-11-11
  • 打赏
  • 举报
回复
结贴谢谢 ky_min 师傅
还在加载中灬 2014-11-05
  • 打赏
  • 举报
回复
嗯,随意,有啥问题,都可以上论坛来讨论
lu仙深 2014-11-05
  • 打赏
  • 举报
回复
3Q 谢谢师傅,这帖子先不结,怕还有不对的地方直接讨论 哈哈哈 师傅真厉害,非常感谢
还在加载中灬 2014-11-05
  • 打赏
  • 举报
回复
;WITH CTE AS(
    SELECT ROW_NUMBER()OVER(PARTITION BY 单号 ORDER BY 收款日期)RN,*FROM TB
)
,CTE2 AS(
	SELECT
		T1.RN+1 RN,T1.单号,T1.单据日期,T1.收款日期,T1.原单金额,T1.未付金额,T1.本次付款,T1.利息率万
		,T1.未付金额-T1.本次付款 LASTMONEY
		,T1.未付金额-T1.本次付款 [结算金额]
		,ISNULL(T2.收款日期,GETDATE()) NEXTDATE
		,DATEDIFF(DD,T1.收款日期,ISNULL(T2.收款日期,GETDATE())) [结算天数]
		,CASE WHEN T2.RN IS NULL THEN 1 ELSE 0 END ISLAST
	FROM
		CTE T1
		LEFT JOIN CTE T2 ON T1.RN+1=T2.RN AND T1.单号=T2.单号
	UNION ALL
	SELECT
		1,单号,单据日期,收款日期,原单金额,未付金额,0,利息率万
		,原单金额 LASTMONEY
		,原单金额 [结算金额]
		,收款日期 NEXTDATE
		,DATEDIFF(DD,单据日期,收款日期) [结算天数]
		,0
	FROM
		CTE WHERE RN=1
)
SELECT
    *
    ,CAST([结算金额]*([结算天数])*利息率万/10000 AS DECIMAL(19,4))[无利滚利]
    ,CAST([结算金额]*(POWER(1+CAST(利息率万 AS REAL)/10000,[结算天数])-1) AS DECIMAL(19,4))[利滚利]
    ,SUM(CAST([结算金额]*([结算天数])*利息率万/10000 AS DECIMAL(19,4)))OVER(PARTITION BY 单号,ISLAST)[无利滚利至今利息]
    ,SUM(CAST([结算金额]*(POWER(1+CAST(利息率万 AS REAL)/10000,[结算天数])-1) AS DECIMAL(19,4)))OVER(PARTITION BY 单号,ISLAST)[利滚利至今利息]
FROM
    CTE2
ORDER BY 单号,NEXTDATE
lu仙深 2014-11-05
  • 打赏
  • 举报
回复
看明白了,初期应该 本次付款 0 那样就OK
还在加载中灬 2014-11-05
  • 打赏
  • 举报
回复
第一条 是初期的,看你要怎么显示了 就是单据日期到 第一次付款日期的记录
lu仙深 2014-11-05
  • 打赏
  • 举报
回复
现在问题又来了,付款记录不明确了,弄不清楚了 又要麻烦师傅了
还在加载中灬 2014-11-05
  • 打赏
  • 举报
回复
引用
还有最后的没有付的1000元应该多弄一行预估到今天
你要的这个,就是最后一行了
还在加载中灬 2014-11-05
  • 打赏
  • 举报
回复
;WITH CTE AS(
    SELECT ROW_NUMBER()OVER(PARTITION BY 单号 ORDER BY 收款日期)RN,*FROM TB
)
,CTE2 AS(
    SELECT
        T1.*
        ,T1.未付金额-T1.本次付款 LASTMONEY
        ,T1.未付金额-T1.本次付款 [结算金额]
        ,ISNULL(T2.收款日期,GETDATE()) NEXTDATE
        ,DATEDIFF(DD,T1.收款日期,ISNULL(T2.收款日期,GETDATE())) [结算天数]
        ,CASE WHEN T2.RN IS NULL THEN 1 ELSE 0 END ISLAST
    FROM
        CTE T1
        LEFT JOIN CTE T2 ON T1.RN+1=T2.RN AND T1.单号=T2.单号
    UNION ALL
    SELECT
        T1.*
        ,T1.原单金额 LASTMONEY
        ,T1.原单金额 [结算金额]
        ,T1.收款日期 NEXTDATE
        ,DATEDIFF(DD,T1.单据日期,T1.收款日期) [结算天数]
        ,0
    FROM
        CTE T1 WHERE T1.RN=1
)
SELECT
    *
    ,CAST([结算金额]*([结算天数])*利息率万/10000 AS DECIMAL(19,4))[无利滚利]
    ,CAST([结算金额]*(POWER(1+CAST(利息率万 AS REAL)/10000,[结算天数])-1) AS DECIMAL(19,4))[利滚利]
    ,SUM(CAST([结算金额]*([结算天数])*利息率万/10000 AS DECIMAL(19,4)))OVER(PARTITION BY 单号,ISLAST)[无利滚利至今利息]
    ,SUM(CAST([结算金额]*(POWER(1+CAST(利息率万 AS REAL)/10000,[结算天数])-1) AS DECIMAL(19,4)))OVER(PARTITION BY 单号,ISLAST)[利滚利至今利息]
FROM
    CTE2
ORDER BY 单号,NEXTDATE
还在加载中灬 2014-11-05
  • 打赏
  • 举报
回复
你这么一要求,我感觉整体结构应该这样才对
CTE AS(
    SELECT ROW_NUMBER()OVER(PARTITION BY 单号 ORDER BY 收款日期)RN,*FROM TB
)
,CTE2 AS(
	SELECT
		T1.*
		,T1.未付金额-T1.本次付款 LASTMONEY
		,T1.未付金额-T1.本次付款 [结算金额]
		,ISNULL(T2.收款日期,GETDATE()) NEXTDATE
		,DATEDIFF(DD,T1.收款日期,ISNULL(T2.收款日期,GETDATE())) [结算天数]
		,CASE WHEN T2.RN IS NULL THEN 1 ELSE 0 END ISLAST
	FROM
		CTE T1
		LEFT JOIN CTE T2 ON T1.RN+1=T2.RN AND T1.单号=T2.单号
	UNION ALL
	SELECT
		T1.*
		,T1.原单金额 LASTMONEY
		,T1.原单金额 [结算金额]
		,T1.收款日期 NEXTDATE
		,DATEDIFF(DD,T1.单据日期,T1.收款日期) [结算天数]
		,0
	FROM
		CTE T1 WHERE T1.RN=1
)
SELECT
    *
    ,CAST([结算金额]*([结算天数])*利息率万/10000 AS DECIMAL(19,4))[无利滚利]
    ,CAST([结算金额]*(POWER(1+CAST(利息率万 AS REAL)/10000,[结算天数])-1) AS DECIMAL(19,4))[利滚利]
    ,SUM(CAST([结算金额]*([结算天数])*利息率万/10000 AS DECIMAL(19,4)))OVER(PARTITION BY 单号,ISLAST)[无利滚利至今利息]
    ,SUM(CAST([结算金额]*(POWER(1+CAST(利息率万 AS REAL)/10000,[结算天数])-1) AS DECIMAL(19,4)))OVER(PARTITION BY 单号,ISLAST)[利滚利至今利息]
FROM
    CTE2
ORDER BY 单号,NEXTDATE
lu仙深 2014-11-05
  • 打赏
  • 举报
回复
最后的2笔我把时间改近了点为了计算方便 还有最后的没有付的1000元应该多弄一行预估到今天 这个能搞的出来不, ky_min 师傅,大侠
lu仙深 2014-11-05
  • 打赏
  • 举报
回复
是按单号来分的
还在加载中灬 2014-11-05
  • 打赏
  • 举报
回复
算收进来的钱,也是按单号分组吧
;WITH CTE AS(
    SELECT ROW_NUMBER()OVER(PARTITION BY 单号 ORDER BY 收款日期)RN,*FROM TB
)
,CTE2 AS(
	SELECT
		T1.*
		,T1.未付金额-T1.本次付款 LASTMONEY
		,CASE WHEN T1.RN=1 THEN T1.原单金额 ELSE T1.未付金额-T1.本次付款 END [结算金额]
		,ISNULL(T2.收款日期,GETDATE()) NEXTDATE
		,CASE WHEN T1.RN=1 THEN DATEDIFF(DD,T1.单据日期,T1.收款日期)ELSE DATEDIFF(DD,T1.收款日期,ISNULL(T2.收款日期,GETDATE())) END [结算天数]
		,CASE WHEN T2.RN IS NULL THEN 1 ELSE 0 END ISLAST
	FROM
		CTE T1
		LEFT JOIN CTE T2 ON T1.RN+1=T2.RN AND T1.单号=T2.单号
)
SELECT
    T1.*
    ,CAST([结算金额]*(T1.[结算天数])*T1.利息率万/10000 AS DECIMAL(19,4))[无利滚利]
    ,CAST([结算金额]*(POWER(1+CAST(T1.利息率万 AS REAL)/10000,T1.[结算天数])-1) AS DECIMAL(19,4))[利滚利]
    ,SUM(CAST([结算金额]*(T1.[结算天数])*T1.利息率万/10000 AS DECIMAL(19,4)))OVER(PARTITION BY T1.单号,ISLAST)[无利滚利至今利息]
    ,SUM(CAST([结算金额]*(POWER(1+CAST(T1.利息率万 AS REAL)/10000,T1.[结算天数])-1) AS DECIMAL(19,4)))OVER(PARTITION BY T1.单号,ISLAST)[利滚利至今利息]
FROM
    CTE2 T1
lu仙深 2014-11-05
  • 打赏
  • 举报
回复
这样,的理想是
lu仙深 2014-11-05
  • 打赏
  • 举报
回复
6楼的搞错了 我重新弄个 表弄错了
lu仙深 2014-11-05
  • 打赏
  • 举报
回复
要这样子,能否可行?
还在加载中灬 2014-11-05
  • 打赏
  • 举报
回复
只要明确要什么就行了
;WITH CTE AS(
    SELECT ROW_NUMBER()OVER(PARTITION BY 单号 ORDER BY 收款日期)RN,*FROM TB
)
,CTE2 AS(
	SELECT
		T1.*
		,T1.未付金额-T1.本次付款 LASTMONEY
		,CASE WHEN T1.RN=1 THEN T1.原单金额 ELSE T1.未付金额-T1.本次付款 END [结算金额]
		,ISNULL(T2.收款日期,GETDATE()) NEXTDATE
		,CASE WHEN T1.RN=1 THEN DATEDIFF(DD,T1.单据日期,T1.收款日期)ELSE DATEDIFF(DD,T1.收款日期,ISNULL(T2.收款日期,GETDATE())) END [结算天数]
	FROM
		CTE T1
		LEFT JOIN CTE T2 ON T1.RN+1=T2.RN AND T1.单号=T2.单号
)
SELECT
    T1.*
    ,CAST([结算金额]*(T1.[结算天数])*T1.利息率万/10000 AS DECIMAL(19,4))[无利滚利]
    ,CAST([结算金额]*(POWER(1+CAST(T1.利息率万 AS REAL)/10000,T1.[结算天数])-1) AS DECIMAL(19,4))[利滚利]
    ,SUM(CAST([结算金额]*(T1.[结算天数])*T1.利息率万/10000 AS DECIMAL(19,4)))OVER(PARTITION BY T1.单号)[无利滚利至今利息]
    ,SUM(CAST([结算金额]*(T1.[结算天数])*T1.利息率万/10000 AS DECIMAL(19,4)))OVER(PARTITION BY T1.单号)[利滚利至今利息]
FROM
    CTE2 T1
lu仙深 2014-11-05
  • 打赏
  • 举报
回复
2号出库单号 6月5日出库 6月8日收款 5000元 这个其中的3天应该是*利息率= 15元啊 2号出库单号 6月5日出库 6月10日收款 4000元 他们之前的天数是2天5K * 利率 5元 预估 2号出库单号 6月5日出库 还有1000没有付款,只能估算到今天的利息 XX元 如果能这样有3行就非常的明了,客户就看的非常清晰
lu仙深 2014-11-05
  • 打赏
  • 举报
回复
貌似还是不对,2号单据,第一笔 怎么会是 7.5 第一笔付进来 5K 但是这个3天发生的金额是 1万 也就是15元 还有就是未付清的,能否单独列一列计算预估到今天的日期的利息?
还在加载中灬 2014-11-05
  • 打赏
  • 举报
回复
;WITH CTE AS(
    SELECT ROW_NUMBER()OVER(PARTITION BY 单号 ORDER BY 收款日期)RN,*FROM TB
)
,CTE2 AS(
	SELECT
		T1.*
		,T1.未付金额-T1.本次付款 LASTMONEY
		,ISNULL(T2.收款日期,GETDATE()) NEXTDATE
		,CASE WHEN T1.RN=1 THEN DATEDIFF(DD,T1.单据日期,T1.收款日期)ELSE DATEDIFF(DD,T1.收款日期,ISNULL(T2.收款日期,GETDATE())) END [结算天数]
	FROM
		CTE T1
		LEFT JOIN CTE T2 ON T1.RN+1=T2.RN AND T1.单号=T2.单号
)
SELECT
    T1.*
    ,CAST((T1.未付金额-T1.本次付款)*(T1.[结算天数])*T1.利息率万/10000 AS DECIMAL(19,4))[无利滚利]
    ,CAST((T1.未付金额-T1.本次付款)*(POWER(1+CAST(T1.利息率万 AS REAL)/10000,T1.[结算天数])-1) AS DECIMAL(19,4))[利滚利]
FROM
    CTE2 T1
你看下,是不是这样
加载更多回复(1)

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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