SQL Server: строка за

У меня есть две таблицы: одна поддерживает активы, а другая - вспомогательные:

Таблица 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

1 ответ

Давайте сделаем некоторые тестовые данные: я добавил 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
Другие вопросы по тегам