【发布时间】:2019-09-19 19:44:24
【问题描述】:
我正在尝试将 GLACCTNBR 列上的数据之一拆分为多个列,但某些记录未正确拆分并最终得到 Null 值。
WITH C AS(
SELECT distinct
m.ACCTID
,m.ITEMDESC
,m.GLACCTNBR
,m.TOTAL
,m.DEPFILENBR
,m.DEPFILESEQ
,m.ITEMACCTID
,m.AMOUNT
,value
,ROW_NUMBER() OVER(PARTITION BY m.GLACCTNBR ORDER BY (SELECT 1)) as rn
FROM TG_ITEM_DATA m
inner join TG_TRAN_DATA t on m.DEPFILENBR = t.DEPFILENBR
AND m.DEPFILESEQ = t.DEPFILESEQ
AND m.EVENTNBR = t.EVENTNBR
AND m.TRANNBR = t.TRANNBR
AND t.VOIDDT IS NULL
AND NOT(t.ITEMIND='T')
AND m.GLACCTNBR IS NOT NULL
CROSS APPLY STRING_SPLIT(m.GLACCTNBR, '|') AS BK
WHERE (
(m.DEPFILENBR=2019261 AND m.DEPFILESEQ=1))
AND m.ACCTID IS NOT NULL
)
SELECT distinct depfilenbr, depfileseq,acctid,GLACCTNBR,ITEMACCTID,AMOUNT,
[1] AS PLUDEP
,[2] AS FUND
,[3] AS REVCD
,[4] AS SUBREVCD
,[5] AS BALSJT
FROM C
PIVOT(
max(VALUE)
FOR RN IN([1],[2],[3],[4],[5])
) as PVT
GROUP BY DEPFILENBR,depfileseq,acctid,GLACCTNBR,ITEMACCTID,AMOUNT,[1],[2],[3],[4],[5]
depfilenbr depfileseq acctid GLACCTNBR ITEMACCTID AMOUNT PLUDEP FUND REVCD SUBREVCD BALSJT
2019261 1 5053 08|48R|3800|00|0000 50-0028 38.41 08 48R 3800 00 0000
2019261 1 5053 08|48R|3896|00|0000 50-001 0 NULL NULL NULL NULL NULL
【问题讨论】:
-
你知道哪些记录返回空值吗?
-
澄清一下:您知道导致 NULL 的记录的实际值吗?例如,如果 GLACCTNBR 的项目多于或少于五个,则可能导致 NULL。换句话说,你说,“一些记录没有被正确分割”——哪些记录?那些价值是什么?尝试只在 CTE 中运行查询...
-
在我的回答中,您会发现使用 v2016+ 进行拆分的更好方法。只是为了回答你的问题:这条线
ROW_NUMBER() OVER(PARTITION BY m.GLACCTNBR ORDER BY (SELECT 1))无论如何都是一个hack,如果在另一行中有另一个GLACCTNBR具有相同的值,它将意外返回。您可能会使用其他分区条件 (PARTITION BY mACCTID,m.GLACCTNBR???) -
@AlanBurstein,我刚刚找到了一种使用 JSON-splitting in a type-safe way 的简单方法(更新 2 部分)。可能对你来说很有趣...
标签: tsql split pivot pivot-table common-table-expression