В Pivot объединяйте таблицы и возвращайте значение только из одной из них, если она имеет значения - PullRequest
0 голосов
/ 25 марта 2019

У меня есть этот запрос (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 Ответ

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

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

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...