В сводных таблицах объединять и возвращать значение только из одной из них, если у нее есть значения

#sql #sql-server #pivot

#sql #sql-сервер #сводная

Вопрос:

У меня есть этот запрос (строка SQL внизу):

 DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
DECLARE @listaId as NVARCHAR(MAX)
SET @listaId = @selezione
SELECT @ColumnName = ISNULL(@ColumnName   ',','')   QUOTENAME(CONVERT(DATE,data,105)) FROM (SELECT DISTINCT  FORMAT ( data, 'd', 'it-IT' ) as data FROM PIANOLAVORO WHERE (data>=@dataDa and data<=@dataA)) AS [data]

SET @DynamicPivotQuery = ';WITH CTE AS(
SELECT v.data,t.cognome,s.CVDESCR FROM pianolavoro v
INNER JOIN orari s ON s.id = v.idorario
INNER JOIN dbstartprv.dbo.ANAGRAFICO_DATI t ON t.id = v.iddip
WHERE v.IDDIP in(' @listaId ')
)
SELECT COGNOME,' @ColumnName ' FROM CTE
PIVOT (MAX(CVDESCR) FOR [data] IN(' @ColumnName ')) p
ORDER BY cognome ASC'
EXEC(@DynamicPivotQuery)
  

это дает мне результат в этой форме:

        2019-03-01   2019-03-02   ...
jack       A             B
john       B             A
  

A и B получены из этого объединения INNER JOIN orari s ON s.id = v.idorario , и я хотел бы показать другие данные вместо A, B, только если в тот же день что-то существует в другой таблице.
Это соединение, которое нужно добавить в приведенный выше запрос join giustif g on t.id=g.iddip and g.idvoce=1001

В принципе, если в таблице pianolavoro на 1 марта у Джека есть «A», но также у него есть значение в тот же день в таблице giustif (скажем, я получаю только значения id = 1001), я хочу отобразить это:

        2019-03-01   2019-03-02   ...
jack     1001            B
john       B             A
  

SQL FIDDLE
Если вы запустите скрипку: у пользователя Cozzolino есть 2 дня отдыха (1-2 июня) и 5 рабочих дней (3-7 июня), а 6 и 7 июня у него есть запись в таблице giustif. Теперь мой запрос выдает мне результат, как в скрипке, но я хочу, чтобы он был похож:

             2019-06-01   2019-06-02   ...  2019-06-05  2019-06-06
Cozzolino     REST          REST      ...     WORK        1001
  

Как я могу этого добиться? Спасибо

Комментарии:

1. Примеры данных и желаемые выходные данные помогут вам прояснить ваш вопрос и помогут понять, чего вы хотите, людям, которые хотят вам помочь.

2. @StepUp Я добавил sql fiddle и желаемый результат на его основе

Ответ №1:

Хорошо, я должен ответить на свой собственный вопрос:

coalesce(x.descr,s.CVDESCR) as cvdescr вместо s.CVDESCR и добавить

 left join giustif g on t.id=g.iddip and v.data=g.data
left join vocibase x on x.id=g.idvoce and idvoce=1001
  

Результирующий запрос:

 DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
DECLARE @listaId as NVARCHAR(MAX)
SET @listaId = @selezione
SELECT @ColumnName = ISNULL(@ColumnName   ',','')   QUOTENAME(data) FROM (SELECT DISTINCT  FORMAT ( data, 'd', 'it-IT' ) as data FROM PIANOLAVORO WHERE (data>=@dataDa and data<=@dataA)) AS [data]

SET @DynamicPivotQuery = ';WITH CTE AS(
SELECT v.data,t.cognome,coalesce(x.descr,s.CVDESCR) as cvdescr FROM pianolavoro v
INNER JOIN orari s ON s.id = v.idorario
INNER JOIN dbstartprv.dbo.ANAGRAFICO_DATI t ON t.id = v.iddip
left join giustif g on t.id=g.iddip and v.data=g.data
left join vocibase x on x.id=g.idvoce and idvoce=1001
WHERE v.IDDIP in(' @listaId ')
)
SELECT COGNOME,' @ColumnName ' FROM CTE
PIVOT (MAX(CVDESCR) FOR [data] IN(' @ColumnName ')) p
ORDER BY cognome ASC'
EXEC(@DynamicPivotQuery)