Sql 基于列值拆分行
我有下表输出-我有:Sql 基于列值拆分行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有下表输出-我有: Account No Description Seg1 Seg2 Seg3 Budget PeriodBalance 000-1120-00 Cash 000 1120 00 $1,000.00 $2,000.00 000-1130-00 Asset 000 1130 00 $1,500.00 $3,000.00
Account No Description Seg1 Seg2 Seg3 Budget PeriodBalance
000-1120-00 Cash 000 1120 00 $1,000.00 $2,000.00
000-1130-00 Asset 000 1130 00 $1,500.00 $3,000.00
我想要的是:
Account No Description Seg1 Seg2 Seg3 Budget PeriodBalance
000-1120-01 Cash 000 1120 01 $500.00 $1,000.00
000-1120-02 Cash 000 1120 02 $500.00 $1,000.00
000-1130-00 Asset 000 1130 00 $1,500.00 $3,000.00
在这里,如果Seg2等于1120,那么我想将其分为两个账户,账户编号为01,02代替段3中的00,如上文“我想要什么”部分所示
declare @period int;
declare @year int
Select @period = 12, @year = 2017
Select
rtrim(c.Actnumbr_1) +'-'+ rtrim(c.Actnumbr_2)+ '-'+ rtrim(c.Actnumbr_3) as ACTNUMST,
c.ACTDESCR,
c.ACTNUMBR_1,
c.ACTNUMBR_2,
c.ACTNUMBR_3,
sum(a.PERDBLNC) as Period_Balance,
b.BUDGETAMT
from GL00100 c
left outer join GL11110 a on c.ACTINDX = a.ACTINDX
Left outer join
(Select
actindx,
sum(budgetamt) as budgetamt
from GL00201
where BUDGETID = 'budget2017'
and periodid <= @period group by actindx) b
on c.ACTINDX = b.ACTINDX
where
a.PERIODID <= @period and
a.year1 = @year
--and c.ACTINDX in ('18','211')
group by
c.ACTDESCR, c.ACTNUMBR_1, c.ACTNUMBR_2, c.ACTNUMBR_3, a.year1,c.ACTINDX,b.BUDGETAMT
我不知道第二个查询是关于什么的,但使用以下示例数据:
IF OBJECT_ID('tempdb..#yourtable') IS NOT NULL DROP TABLE #yourTable;
CREATE TABLE #yourtable
(
[Account No] varchar(20),
[Description] varchar(20),
Seg1 char(3),
Seg2 smallint,
Seg3 varchar(5),
Budget money,
PeriodBalance money
);
INSERT #yourTable
VALUES ('000-1120-00', 'Cash', '000', 1120, '00', $1000.00, $2000.00),
('000-1130-00', 'Asset','000', 1130, '00', $1500.00, $3000.00);
您可以这样做:
SELECT
[Account No] = SUBSTRING([Account No], 1, CHARINDEX('-', [Account No], CHARINDEX('-', [Account No])+1))+ordinal,
[Description],
Seg1, Seg2,
Seg3 = ordinal,
Budget = Budget / 2,
PeriodBalance = PeriodBalance / 2
FROM @yourTable
CROSS JOIN (VALUES ('01'), ('02')) split(ordinal)
WHERE Seg2 = 1120
UNION ALL
SELECT [Account No], [Description], Seg1, Seg2, Seg3, Budget, PeriodBalance
FROM @yourTable
WHERE Seg2 <> 1120;
没有人能回答这个简单的问题,这不是很奇怪吗。
Account No Description Seg1 Seg2 Seg3 Budget PeriodBalance
---------------------- -------------------- ---- ------ ----- --------------------- ---------------------
000-1120-01 Cash 000 1120 01 500.00 1000.00
000-1120-02 Cash 000 1120 02 500.00 1000.00
000-1130-00 Asset 000 1130 00 1500.00 3000.00