2016-06-10 49 views
0

我必须从列中获取记录的行,并构建一个包含两列的新表。SQL - 从列的记录中逐行检索并构建两列的列表

在原始表格列中会有一个9位数的字符,我必须将其作为Bill ID选取。对于每个帐单ID都会有一些消息。所以在我的新表中,它将是Bill ID和Message两列。

我必须从原始表中选择多达5条消息在帐单ID之下,或者如果我比5条消息早打了一个新帐单ID。

create table #t 
(col2 nvarchar(4000)) 

insert into #t values 
('No Bills Picked up for Processing'), 
('Total 5 Bills picked up for Processing'), 
('AB358399B'), 
('XML Validation Failed'), 
('CN290550T'), 
('service Call Done'), 
('Status : SUCCESSFULL'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('CN290570T'), 
('service Call Done'), 
('Status : SUCCESSFULL'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing') 


select * into #billid from #t 
where len(ltrim(rtrim(col2))) = 9 

select * from #billid 

select * from #t 




-- Expected Results 
--Bill   Message 
-------------------------- 
-- AB358399B XML Validation Failed 
-- CN290550T service Call Done 
--    Status : SUCCESSFULL 
--    No Bills Picked up for Processing 
--    No Bills Picked up for Processing 
--    No Bills Picked up for Processing 
-- CN290570T service Call Done 
--    Status : SUCCESSFULL 
--    No Bills Picked up for Processing 
--    No Bills Picked up for Processing 
--    No Bills Picked up for Processing 
+1

你是如何定义的顺序你的原始数据?从你发布的内容来看,这是不可能的,因为你没有任何东西可以订购。 –

+1

您是否正在从文本文件加载?如果是这样,可以将一个标识(int)添加到您的导入结构中以创建适当的序列? –

+0

约翰你是对的,是的,我从平面文件加载它。我可以添加一个标识列。 – goofyui

回答

1

请注意,有没有隐式排序顺序!结果集的排序是随机的!

所以我介绍了一个IDENTITY列...

有了SQL Server 2012+你可以使用LEADLAG,与2008年必须招多一点...

顺便说一句:我会避免只有第一个是写着的方法。这是你的东西表现层应该做的......

--Your table with an IDENTITY column 
create table #t 
(ID INT IDENTITY,col2 nvarchar(4000)) 

insert into #t(col2) values 
('No Bills Picked up for Processing'), 
('Total 5 Bills picked up for Processing'), 
('AB358399B'), 
('XML Validation Failed'), 
('CN290550T'), 
('service Call Done'), 
('Status : SUCCESSFULL'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('CN290570T'), 
('service Call Done'), 
('Status : SUCCESSFULL'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'), 
('No Bills Picked up for Processing'); 

- 兼这是查询

WITH Only9Chars AS 
(
    SELECT ID,col2 
    FROM #t 
    WHERE len(ltrim(rtrim(col2))) = 9 
) 
,StartAndEnd AS 
(
    SELECT o9c.ID+1 AS startIndex 
      ,o9c.col2 AS Bill 
      ,nxt.ID 
      ,ISNULL(nxt.ID,999999)-1 AS endIndex 
    FROM Only9Chars AS o9c 
    OUTER APPLY(SELECT TOP 1 nxt.ID FROM Only9Chars AS nxt WHERE nxt.ID>o9c.ID) AS nxt 
) 
SELECT CASE WHEN ROW_NUMBER() OVER(PARTITION BY Bill ORDER BY ID)=1 THEN Bill ELSE '' END AS Bill 
     ,Details.* 
FROM StartAndEnd 
OUTER APPLY(SELECT x.col2 
      FROM #t AS x 
      WHERE x.ID BETWEEN startIndex AND endIndex) AS Details 
GO 
DROP TABLE #t; 

这是结果

+-----------+-----------------------------------+ 
| Bill  | col2        | 
+-----------+-----------------------------------+ 
| AB358399B | XML Validation Failed    | 
+-----------+-----------------------------------+ 
| CN290550T | service Call Done     | 
+-----------+-----------------------------------+ 
|   | Status : SUCCESSFULL    | 
+-----------+-----------------------------------+ 
|   | No Bills Picked up for Processing | 
+-----------+-----------------------------------+ 
|   | No Bills Picked up for Processing | 
+-----------+-----------------------------------+ 
|   | No Bills Picked up for Processing | 
+-----------+-----------------------------------+ 
| CN290570T | service Call Done     | 
+-----------+-----------------------------------+ 
|   | Status : SUCCESSFULL    | 
+-----------+-----------------------------------+ 
|   | No Bills Picked up for Processing | 
+-----------+-----------------------------------+ 
|   | No Bills Picked up for Processing | 
+-----------+-----------------------------------+ 
|   | No Bills Picked up for Processing | 
+-----------+-----------------------------------+ 
|   | No Bills Picked up for Processing | 
+-----------+-----------------------------------+ 
|   | No Bills Picked up for Processing | 
+-----------+-----------------------------------+ 
|   | No Bills Picked up for Processing | 
+-----------+-----------------------------------+ 
|   | No Bills Picked up for Processing | 
+-----------+-----------------------------------+ 
|   | No Bills Picked up for Processing | 
+-----------+-----------------------------------+ 
|   | No Bills Picked up for Processing | 
+-----------+-----------------------------------+ 
|   | No Bills Picked up for Processing | 
+-----------+-----------------------------------+ 
|   | No Bills Picked up for Processing | 
+-----------+-----------------------------------+ 
+0

谢谢你,你好!非常感谢。只是一个更正。由于文件太大,加载时需要一段时间。是否有可能加载所有的行,而不是限制多达5个。 – goofyui

+0

@goofyui,对不起,我不明白这一点......这部分需要很长时间,你想要减少到5行/行? – Shnugo

+0

这是我的第一篇文章:我必须从原始表中选择多达5条消息在帐单ID下面,或者如果我比5条消息早打了一个新帐单ID。 ..现在我想从原始表格中加载帐单ID下的所有消息,直到我点击一个新的帐单ID。我不确定,这个条件是否已经应用到你的sql脚本中。如果它没有被应用,那么它是好的。 – goofyui