2015-01-14 97 views
0

我有两个表一个是保持资产和维持子资产其他:SQL服务器:排过

表1:assethdr

assetid 
0000000002 
0000000003 

表2:assetdet

assetsubid assetid 
0000000001 0000000002 
0000000002 0000000002 
0000000003 0000000002 
0000000001 0000000003 
0000000001 0000000109 
0000000002 0000000109 
0000000003 0000000109 
0000000004 0000000109 
0000000005 0000000109 

我做了这个查询:

WITH cte_assets 
as 
(SELECT 
    CASE WHEN ROW_NUMBER() OVER(PARTITION BY h.assetid ORDER BY f.assetsubid) = 1 
    THEN 'BA-'+LTRIM(RTRIM(h.CpnyId))+'-'+right(LTRIM(h.AssetId),5)+'-'+'0001' ELSE '' END as [Business Asset Number] 
    , 'BA'+ 
    +'-'+RIGHT(LTRIM(RTRIM(ltrim(rtrim(f.cpnyid)))),3) 
+'-'+ 
RIGHT(f.assetid,5)+'-'+RIGHT(f.assetsubid,4)as [Component Asset ID*] 
FROM pssfaassets f 
INNER JOIN PSSFAAssetsHdr h 
ON f.AssetId=h.assetid 
AND h.AssetId LIKE '%0000000002' 
--GROUP BY h.cpnyid,h.AssetId,f.AssetSubId 
) 
    SELECT * FROM cte_assets 
    WHERE [Business Asset Number]<>[Component Asset ID*] 
    ORDER BY [Component Asset ID*],[Business Asset Number] 

,但我没有得到正确的结果,这应该是:

Rownum Business Asset Number rownum2 Component Asset ID* 
1  BA-613-00002-0001   1  BA-613-00002-0002 
1         2  BA-613-00002-0003 
2  BA-607-00109-001   1  BA-607-00109-0002 
2         2  BA-607-00109-0003 
2         3  BA-607-00109-0004 
2         4  BA-607-00109-0005 
+0

CASE没有结束 – Alsin

+0

是的,它向右滚动,你会看到它 – Michelle

+0

如果你把assertdr和assetdet记录的cpnyid放在一起让我们可以更好地查看数据,可能会更容易一些。 –

回答

0

让我们做一些测试数据:我加入了cpnyid(猜测基于你的输出)的标题和细节都记录。

DECLARE @assethdr TABLE 
(
    assetid varchar(20), 
    CpnyId varchar(20) 
) 
INSERT INTO @assethdr 
(assetid, CpnyId) 
VALUES 
('0000000002', '613'), 
('0000000003', '605'), 
('0000000109', '607'); 

DECLARE @assetdet TABLE 
(
    assetsubid varchar(20), 
    assetid varchar(20), 
    CpnyId varchar(20) 
); 

INSERT INTO @assetdet 
(assetsubid, assetid, CpnyId) 
VALUES 
('0000000001', '0000000002', '613'), 
('0000000002', '0000000002', '613'), 
('0000000003', '0000000002', '613'), 
('0000000001', '0000000003', '605'), 
('0000000001', '0000000109', '607'), 
('0000000002', '0000000109', '607'), 
('0000000003', '0000000109', '607'), 
('0000000004', '0000000109', '607'), 
('0000000005', '0000000109', '607'); 

查询是相似的,但我添加的行数输出:

WITH cte_assets 
as 
(SELECT 
    ROW_NUMBER() OVER (PARTITION BY h.assetid ORDER BY f.assetsubid) AS RN, 
    CASE WHEN ROW_NUMBER() OVER(PARTITION BY h.assetid ORDER BY f.assetsubid) = 2 
    THEN 'BA-'+LTRIM(RTRIM(h.CpnyId))+'-'+right(LTRIM(h.AssetId),5)+'-'+'0001' ELSE '' END as [Business Asset Number] 
    , 'BA'+ 
    +'-'+RIGHT(LTRIM(RTRIM(ltrim(rtrim(f.cpnyid)))),3) 
+'-'+ 
RIGHT(f.assetid,5)+'-'+RIGHT(f.assetsubid,4)as [Component Asset ID*] 
FROM @assetdet f 
INNER JOIN @assethdr h 
ON f.AssetId=h.assetid 
--AND h.AssetId LIKE '%0000000002' 
--GROUP BY h.cpnyid,h.AssetId,f.AssetSubId 
) 
通过添加行号的

现在,你想绕开它似乎是第一场比赛(从你期望的输出):

SELECT (RN - 1) AS RowNum, [Business Asset Number], [Component Asset ID*] 
    FROM cte_assets 
    WHERE [RN] != 1 
    ORDER BY [Component Asset ID*],[Business Asset Number] 

这里是输出:

RowNum Business Asset Number Component Asset ID* 
1 BA-607-00109-0001 BA-607-00109-0002 
2      BA-607-00109-0003 
3      BA-607-00109-0004 
4      BA-607-00109-0005 
1 BA-613-00002-0001 BA-613-00002-0002 
2      BA-613-00002-0003