簡介:master..spt_values,數據行拆分簡單小技巧
SELECT ProjGUID , CostGUID , SUM(FtAmount) AS FtAmount , BeginMonth , EndMonth , ( EndMonth - BeginMonth ) + 1 AS RowCountNum FROM cb_Loan2Cost WHERE LoanGUID = '6D88EB2B-18FA-4A4A-9ADB-9873B0F14381' GROUP BY ProjGUID , CostGUID , EndMonth , BeginMonth
SQl結果集查出如下圖:
一句話拆分出對應的數據條數: SELECT M.ProjGUID, M.CostGUID, CASE WHEN M.XnMonth=M.EndMonth THEN M.NewFtAmount+(M.FtAmount-M.NewFtAmount*M.FactMonth) ELSE M.NewFtAmount END FactFtAmount, M.FactMonth FROM ( SELECT T.ProjGUID , T.CostGUID , T.FtAmount / T.RowCountNum AS NewFtAmount , T.FtAmount, T.BeginMonth , T.EndMonth , CASE WHEN BeginMonth = EndMonth THEN EndMonth ELSE spt.number END FactMonth, spt.number AS XnMonth FROM ( SELECT ProjGUID , CostGUID , SUM(FtAmount) AS FtAmount , BeginMonth , EndMonth , ( EndMonth - BeginMonth ) + 1 AS RowCountNum FROM cb_Loan2Cost WHERE LoanGUID = '6D88EB2B-18FA-4A4A-9ADB-9873B0F14381' GROUP BY ProjGUID , CostGUID , EndMonth , BeginMonth ) T , master..spt_values spt WHERE T.RowCountNum >= spt.number AND spt.type = 'P' AND spt.number > 0 )M
最終結果集如下圖:
拆分SQL核心如下:
借助數據庫常量表:master..spt_values
此表記錄都是數據庫中常用的常量值
SELECT number FROM master..spt_values
簡單的小例子
create table T(A varchar(10), B varchar(10), C int) insert into T select 'AA', '筆', 5 union all select 'AB', '紙', 3
select t.A 編碼, t.B as 名稱,1 as 數量 from t,master..spt_values s where t.c>= s.number and s.type= 'P' and s.number >0