2015-01-14 101 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