Reputation: 194
I have this query (SQL fiddle at the bottom):
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)
that gives me a result in this form:
2019-03-01 2019-03-02 ...
jack A B
john B A
A and B are get from this join INNER JOIN orari s ON s.id = v.idorario
and I would like to show other data instead of A, B only if in the same day something exists on another table.
This is the join to be added in the above query join giustif g on t.id=g.iddip and g.idvoce=1001
Basically if in table pianolavoro on the 1st of march Jack has "A" but also he has a value on the same day in giustif table (say I get only id values = 1001), I want to display this:
2019-03-01 2019-03-02 ...
jack 1001 B
john B A
SQL FIDDLE If you run the fiddle: the user Cozzolino has 2 resting days (1-2 june) and 5 working days (3-7 june) and on 6 and 7 of june he has a record in the table giustif. Now my query give me the result as in the fiddle, but I want it to be like:
2019-06-01 2019-06-02 ... 2019-06-05 2019-06-06
Cozzolino REST REST ... WORK 1001
How can I achieve that? Thanks
Upvotes: 0
Views: 44
Reputation: 194
Ok, I have to answer my own question:
coalesce(x.descr,s.CVDESCR) as cvdescr
instead of s.CVDESCR
and add
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
Result query is:
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)
Upvotes: 1