#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)