SQL Server 2014: как включить заголовок и детали в экспорт CSV - PullRequest
2 голосов
/ 07 марта 2019

Я пытаюсь создать сценарий для экспорта файла CSV, чтобы показать запись заголовка и соответствующую подробную запись.

В качестве примера вывод должен быть

20138000100012, H,  2013800010, 03.04.2017, WK, 001,    2,  21.05.1984, NULL,   C
20138000100012, D,  INSURE, 0.71
20138000100012, D,  RENT,   98.58
20138000200060, H,  2013800020, 02.04.2018, WK, 006,    0,  25.05.2009, NULL,   C
20138000200060, D,  INSURE, 0.80
20138000200060, D,  RENT,   98.58
20138000500052, D,  LAUNDR, 1.29

Я попыталсячтобы произвести это, используя приведенный ниже скрипт T-SQL:

select * 
from 
    (select 
         cast(dbo.[RE-TENANCY].[TENANCY-REF] as nvarchar) AS [0],
         'H' as [RowLevel],
         substring(convert(varchar(10),dbo.[RE-TENANCY].[TENANCY-REF]), 1, 10) AS [1],
         -- convert(varchar,dbo.[IH-PLACE-CHG].[START-DATE],104) AS [  ]
         format(dbo.[IH-PLACE-CHG].[START-DATE], 'dd.MM.yyyy') AS [2],
         dbo.[RE-TENANCY].[RENT-GROUP] AS [3], 
         cast(substring( dbo.[RE-TENANCY].[TENANCY-REF],11,3) as nvarchar) AS [4]
, cast(substring( dbo.[RE-TENANCY].[TENANCY-REF],14,1) as nvarchar) AS [5]
, cast(format(dbo.[RE-TENANCY].[TNCY-START], 'dd.MM.yyyy') as nvarchar) AS [6]
, cast(format(dbo.[RE-TENANCY].[TNCY-END], 'dd.MM.yyyy') as nvarchar) AS [7]
, substring(dbo.[RE-TENANCY].[TNCY-STATUS],1,1) AS [8]
    FROM            
        dbo.[RE-EX-RAISE-DEBIT-DTL] 
    INNER JOIN
        dbo.[RE-TENANCY] ON dbo.[RE-EX-RAISE-DEBIT-DTL].REFERENCE = dbo.[RE-TENANCY].[TENANCY-REF] 
    INNER JOIN
        dbo.[IH-PLACE-CHG] ON substring(dbo.[RE-TENANCY].[TENANCY-REF],1,10) = dbo.[IH-PLACE-CHG].[PLACE-REF]

    union

select cast(dbo.[RE-TENANCY].[TENANCY-REF] as nvarchar) AS [0]
,'D' as [RowLevel]

, dbo.[RE-EX-RAISE-DEBIT-DTL].[ACCOUNT-CODE] AS [1]
, convert(varchar,[dbo].[RE-EX-RAISE-DEBIT-DTL].[CHARGE-AMT]) AS [2]
, '' AS [3]
, '' AS [4]
, '' AS [5]
, '' AS [6]
, '' AS [7]
, '' AS [8]
FROM            dbo.[RE-EX-RAISE-DEBIT-DTL] INNER JOIN
                         dbo.[RE-TENANCY] ON dbo.[RE-EX-RAISE-DEBIT-DTL].REFERENCE = dbo.[RE-TENANCY].[TENANCY-REF] INNER JOIN
                         dbo.[IH-PLACE-CHG] ON substring(dbo.[RE-TENANCY].[TENANCY-REF],1,10) = dbo.[IH-PLACE-CHG].[PLACE-REF]


) AS HBfile order by cast(HBfile.[0] as bigint), HBfile.[6] desc

, но этот код неверно генерирует следующие результаты:

20138000100012, H,  2013800010, 03.04.2017, WK, 001,    2,  21.05.1984, NULL,   C
20138000100012, H,  2013800010, 04.04.2016, WK, 001,    2,  21.05.1984, NULL,   C
20138000100012, H,  2013800010, 02.04.2018, WK, 001,    2,  21.05.1984, NULL,   C
20138000100012, D,  INSURE, 0.71
20138000100012, D,  RENT,   98.58
20138000200060, H,  2013800020, 02.04.2018, WK, 006,    0,  25.05.2009, NULL,   C
20138000200060, H,  2013800020, 03.04.2017, WK, 006,    0,  25.05.2009, NULL,   C
20138000200060, H,  2013800020, 04.04.2016, WK, 006,    0,  25.05.2009, NULL,   C
20138000200060, D,  INSURE, 0.80
20138000200060, D,  RENT,   98.58
20138000500060, D,  LAUNDR, 1.29

Любые мысли, помощь приветствуется.Спасибо

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Попытка выяснить проблему

Поскольку дублирование находится в части заголовков, вам следует взглянуть на запрос заголовков:

select * 
from 
    (select 
         cast(dbo.[RE-TENANCY].[TENANCY-REF] as nvarchar) AS [0],
         'H' as [RowLevel],
         substring(convert(varchar(10),dbo.[RE-TENANCY].[TENANCY-REF]), 1, 10) AS [1],
         -- convert(varchar,dbo.[IH-PLACE-CHG].[START-DATE],104) AS [  ]
         format(dbo.[IH-PLACE-CHG].[START-DATE], 'dd.MM.yyyy') AS [2],
         dbo.[RE-TENANCY].[RENT-GROUP] AS [3], 
         cast(substring( dbo.[RE-TENANCY].[TENANCY-REF],11,3) as nvarchar) AS [4]
, cast(substring( dbo.[RE-TENANCY].[TENANCY-REF],14,1) as nvarchar) AS [5]
, cast(format(dbo.[RE-TENANCY].[TNCY-START], 'dd.MM.yyyy') as nvarchar) AS [6]
, cast(format(dbo.[RE-TENANCY].[TNCY-END], 'dd.MM.yyyy') as nvarchar) AS [7]
, substring(dbo.[RE-TENANCY].[TNCY-STATUS],1,1) AS [8]
    FROM            
        dbo.[RE-EX-RAISE-DEBIT-DTL] 
    INNER JOIN
        dbo.[RE-TENANCY] ON dbo.[RE-EX-RAISE-DEBIT-DTL].REFERENCE = dbo.[RE-TENANCY].[TENANCY-REF] 
    INNER JOIN
        dbo.[IH-PLACE-CHG] ON substring(dbo.[RE-TENANCY].[TENANCY-REF],1,10) = dbo.[IH-PLACE-CHG].[PLACE-REF]

Этот запрос содержит 2 внутренних объединения, которыеозначает, что сгенерированные строки могут быть больше, чем количество источников, если соединение не выполнено для отношения 1-1.

После проверки предоставленного вами результата:

20138000100012, H,  2013800010, 03.04.2017, WK, 001,    2,  21.05.1984, NULL,   C
20138000100012, H,  2013800010, 04.04.2016, WK, 001,    2,  21.05.1984, NULL,   C
20138000100012, H,  2013800010, 02.04.2018, WK, 001,    2,  21.05.1984, NULL,   C
20138000100012, D,  INSURE, 0.71
20138000100012, D,  RENT,   98.58
20138000200060, H,  2013800020, 02.04.2018, WK, 006,    0,  25.05.2009, NULL,   C
20138000200060, H,  2013800020, 03.04.2017, WK, 006,    0,  25.05.2009, NULL,   C
20138000200060, H,  2013800020, 04.04.2016, WK, 006,    0,  25.05.2009, NULL,   C
20138000200060, D,  INSURE, 0.80
20138000200060, D,  RENT,   98.58
20138000500060, D,  LAUNDR, 1.29

Все столбцы заголовкаидентичен, за исключением четвертого столбца, который генерируется с помощью этой команды:

format(dbo.[IH-PLACE-CHG].[START-DATE], 'dd.MM.yyyy') AS [2]

Решение

Если вам нужно только первое значение, вы можете использовать First_Value() оконную функцию:

FIRST_VALUE(format(dbo.[IH-PLACE-CHG].[START-DATE], 'dd.MM.yyyy')) OVER(PARTITION BY  cast(dbo.[RE-TENANCY].[TENANCY-REF] as nvarchar)) as [2]

И вы можете добавить отдельный оператор в запрос заголовков, вся команда SQL будет выглядеть так:

select * 
from 
    (select Distinct 
         cast(dbo.[RE-TENANCY].[TENANCY-REF] as nvarchar) AS [0],
         'H' as [RowLevel],
         substring(convert(varchar(10),dbo.[RE-TENANCY].[TENANCY-REF]), 1, 10) AS [1],
         -- convert(varchar,dbo.[IH-PLACE-CHG].[START-DATE],104) AS [  ]
         FIRST_VALUE(format(dbo.[IH-PLACE-CHG].[START-DATE], 'dd.MM.yyyy')) OVER(PARTITION BY  cast(dbo.[RE-TENANCY].[TENANCY-REF] as nvarchar)) as [2],
         dbo.[RE-TENANCY].[RENT-GROUP] AS [3], 
         cast(substring( dbo.[RE-TENANCY].[TENANCY-REF],11,3) as nvarchar) AS [4]
, cast(substring( dbo.[RE-TENANCY].[TENANCY-REF],14,1) as nvarchar) AS [5]
, cast(format(dbo.[RE-TENANCY].[TNCY-START], 'dd.MM.yyyy') as nvarchar) AS [6]
, cast(format(dbo.[RE-TENANCY].[TNCY-END], 'dd.MM.yyyy') as nvarchar) AS [7]
, substring(dbo.[RE-TENANCY].[TNCY-STATUS],1,1) AS [8]
    FROM            
        dbo.[RE-EX-RAISE-DEBIT-DTL] 
    INNER JOIN
        dbo.[RE-TENANCY] ON dbo.[RE-EX-RAISE-DEBIT-DTL].REFERENCE = dbo.[RE-TENANCY].[TENANCY-REF] 
    INNER JOIN
        dbo.[IH-PLACE-CHG] ON substring(dbo.[RE-TENANCY].[TENANCY-REF],1,10) = dbo.[IH-PLACE-CHG].[PLACE-REF]

    union

select cast(dbo.[RE-TENANCY].[TENANCY-REF] as nvarchar) AS [0]
,'D' as [RowLevel]

, dbo.[RE-EX-RAISE-DEBIT-DTL].[ACCOUNT-CODE] AS [1]
, convert(varchar,[dbo].[RE-EX-RAISE-DEBIT-DTL].[CHARGE-AMT]) AS [2]
, '' AS [3]
, '' AS [4]
, '' AS [5]
, '' AS [6]
, '' AS [7]
, '' AS [8]
FROM            dbo.[RE-EX-RAISE-DEBIT-DTL] INNER JOIN
                         dbo.[RE-TENANCY] ON dbo.[RE-EX-RAISE-DEBIT-DTL].REFERENCE = dbo.[RE-TENANCY].[TENANCY-REF] INNER JOIN
                         dbo.[IH-PLACE-CHG] ON substring(dbo.[RE-TENANCY].[TENANCY-REF],1,10) = dbo.[IH-PLACE-CHG].[PLACE-REF]


) AS HBfile order by cast(HBfile.[0] as bigint), HBfile.[6] desc
0 голосов
/ 07 марта 2019

Используйте предложение WHERE, чтобы отфильтровать нежелательные строки заголовка.Желательность, кажется, основана на первом столбце даты в ваших результатах.

...