#sql #sql-server #common-table-expression
Вопрос:
Итак, у меня есть следующий CTE:
with dupeinv AS ( select * from ( select tci.t_idoc, tci.t_idat, ROW_NUMBER() OVER (partition by tci.t_idoc ORDER BY tci.t_idoc, tci.t_idat DESC) as rn from [ln106].[dbo].tcisli305100 tci ) as t where t.rn = 1 )
В приведенной выше таблице есть дубликаты ([ln106].[dbo].tcisli305100) , следовательно, CTE для получения отдельных значений. Я хочу отформатировать только эти значения в приведенном ниже запросе (с префиксом —)
select 'JCI' as BU, RTRIM(LTRIM(cl.t_orno)) AS SALES_ORDER_NUMBER , cl.t_pono AS SALES_ORDER_LINE_NUMBER , CONCAT(cl.t_shpm, cl.t_pono, cl.t_idoc) AS SHIPPING_RECORD_ID ,CASE WHEN cl.t_dqua = 0 or cl.t_dqua is null THEN cl.t_amti ELSE cl.t_amti / cl.t_dqua END AS AR_INVOICE_LINE_ITEM_PRICE_LOCAL , cl.t_line AS AR_INVOICE_LINE_NUMBER , cl.t_dqua AS AR_INVOICE_LINE_ITEM_QUANTITY --- , concat(dupeinv.t_idoc,'|',format(dupeinv.t_idat,'MMddyyyy') --- ,ci.t_ccur AS AR_INVOICE_CURRENCY , ci.t_idat AS AR_INVOICE_DATE FROM [ln106].[dbo].tcisli310100 cl LEFT JOIN [ln106].[dbo].tcisli305100 ci ON cl.t_idoc = ci.t_idoc LEFT JOIN t di on cl.t_doc = di_t_doc LEFT JOIN (SELECT t_orno,t_pono FROM [ln106].[dbo].ttdsls401100 WHERE t_oltp lt;gt; 1 group by t_orno,t_pono) as l --Jed 10162020 Changed the join to prevent duplicate records ON l.t_orno=cl.t_orno COLLATE SQL_Latin1_General_CP1_CI_AS AND l.t_pono=cl.t_pono LEFT JOIN dupeinv tci on cl.r_idoc = ci.t_doc WHERE ci.t_idat gt; '2017'
Запрос не любит, когда я ссылаюсь на него в основном запросе. Может ли кто-нибудь помочь или предложить лучшую идею?
Комментарии:
1. Вы получаете сообщение об ошибке?
2. Да, Msg 102, Уровень 15, Состояние 1, Строка 29 Неправильный синтаксис рядом с»,». Msg 156, Уровень 15, Состояние 1, Строка 34 Неверный синтаксис рядом с ключевым словом «как».
3. в прокомментированной строке отсутствует правая скобка.
Ответ №1:
Ваш окончательный запрос должен выглядеть примерно так:
WITH dupeinv AS (SELECT * FROM (SELECT tci.t_idoc, tci.t_idat, ROW_NUMBER() OVER (PARTITION BY tci.t_idoc ORDER BY tci.t_idoc, tci.t_idat DESC) AS rn FROM [ln106].[dbo].tcisli305100 tci) AS t WHERE t.rn = 1 ) SELECT 'JCI' AS BU, RTRIM(LTRIM(cl.t_orno)) AS SALES_ORDER_NUMBER , cl.t_pono AS SALES_ORDER_LINE_NUMBER , CONCAT(cl.t_shpm, cl.t_pono, cl.t_idoc) AS SHIPPING_RECORD_ID , CASE WHEN cl.t_dqua = 0 OR cl.t_dqua IS NULL THEN cl.t_amti ELSE cl.t_amti / cl.t_dqua END AS AR_INVOICE_LINE_ITEM_PRICE_LOCAL , cl.t_line AS AR_INVOICE_LINE_NUMBER , cl.t_dqua AS AR_INVOICE_LINE_ITEM_QUANTITY , concat(dupeinv.t_idoc, '|', format(dupeinv.t_idat, 'MMddyyyy')) , ci.t_ccur AS AR_INVOICE_CURRENCY , ci.t_idat AS AR_INVOICE_DATE FROM [ln106].[dbo].tcisli310100 cl LEFT JOIN [ln106].[dbo].tcisli305100 ci ON cl.t_idoc = ci.t_idoc LEFT JOIN t di ON cl.t_doc = di_t_doc LEFT JOIN (SELECT t_orno, t_pono FROM [ln106].[dbo].ttdsls401100 WHERE t_oltp lt;gt; 1 GROUP BY t_orno, t_pono) AS l --Jed 10162020 Changed the join to prevent duplicate records ON l.t_orno=cl.t_orno COLLATE SQL_Latin1_General_CP1_CI_AS AND l.t_pono=cl.t_pono LEFT JOIN dupeinv tci ON cl.r_idoc = ci.t_doc WHERE ci.t_idat gt; '2017'