Buenas tardes;
Amigos del Foros del Web, nuevamente vengo con inquietudes hace algun tiempo he venido aprendiendo bases de datos en SERVER SQL, y he publicado algunas preguntas que muy amablemente uds me han respondido especialmente el usuario libras, (muchas gracias por su ayuda).
Como dije he venido aprendiendo de tablas pivote en SERVER SQL pero hoy cuando intente sumar los valores resultados de una tabla , descubri que no puedo sumar estos resultados ya que me arroja 1 lo cual no es el resultado de la operacion. me explico tengo las siguientes tablas:
Una tabla que guarda un consecutivo un codigo de trabajador y unas novedades que pueden ser del tipo labor1, labor2 o labor3
consecutivo | trabajador |labor1|labor2|labor3
01 | 001 | 1|0|0
01 | 002 | 0|1|0
01 | 003 | 0|0|1
01 | 004 | 0|1|0
consecutivo | trabajador |labor1|labor2|labor3
02 | 001 | 0|0|1
02 | 002 | 0|0|0
02 | 003 | 0|1|0
02 | 004 | 1|0|0
consecutivo | trabajador |labor1|labor2|labor3
03 | 001 | 1|0|0
03 | 002 | 1|0|0
03 | 003 | 0|0|0
03 | 004 | 1|0|0
consecutivo | trabajador |labor1|labor2|labor3
04 | 001 | 0|1|0
04 | 002 | 0|1|0
04 | 003 | 1|0|0
04 | 004 | 0|0|1
consecutivo | trabajador |labor1|labor2|labor3
05 | 001 | 1|0|0
05 | 002 | 0|0|1
05 | 003 | 0|0|0
05 | 004 | 0|0|1
consecutivo | trabajador |labor1|labor2|labor3
06 | 001 | 0|0|0
06 | 002 | 0|1|0
06 | 003 | 0|1|0
06 | 004 | 0|0|0
consecutivo | trabajador |labor1|labor2|labor3
07 | 001 | 0|1|0
07 | 002 | 0|1|0
07 | 003 | 1|0|0
07 | 004 | 0|0|1
consecutivo | trabajador |labor1|labor2|labor3
08 | 001 | 0|0|1
08 | 002 | 0|0|1
08 | 003 | 1|0|0
08 | 004 | 1|0|0
08 | 005 | 0|0|1
Y una tabla que guarda las fechas
consecutivo | fecha
01 | 2013-11-01
02 | 2013-11-02
03 | 2013-11-03
04 | 2013-11-04
05 | 2013-11-05
06 | 2013-11-06
07 | 2013-11-07
08 | 2013-11-08
Lo que hace en el momento es que al enviar el rango de fechas 2013-11-01 al 2013-11-08
el resultado sea el siguiente
trabajador |2013-11-01 |2013-11-02 |2013-11-03 |2013-11-04 |2013-11-05 |2013-11-06 |2013-11-07 |2013-11-08
001|1| 3| 1| 2| 1| 4| 2| 3|
002|2| 4| 1| 2| 3| 2| 2| 3|
003|3| 2| 4| 1| 4| 2| 1| 1|
004|2| 1| 1| 3| 3| 4| 3| 1|
005|NULL| NULL| NULL| NULL| NULL| NULL| NULL| 3
La manera en la que lo hace es la siguiente:
Código SQL:
Ver originalDROP TABLE #temp
DROP TABLE #temp2
CREATE TABLE #temp
(
consecutivo VARCHAR(20),
trabajador VARCHAR(20),
labor1 INT,
labor2 INT,
labor3 INT
)
INSERT INTO #temp VALUES ('01','001' ,1,0,0)
INSERT INTO #temp VALUES ('01','002' ,0,1,0)
INSERT INTO #temp VALUES ('01','003' ,0,0,1)
INSERT INTO #temp VALUES ('01','004' ,0,1,0)
INSERT INTO #temp VALUES ('02','001',0,0,1)
INSERT INTO #temp VALUES ('02','002',0,0,0)
INSERT INTO #temp VALUES ('02','003',0,1,0)
INSERT INTO #temp VALUES ('02','004',1,0,0)
INSERT INTO #temp VALUES ('03','001',1,0,0)
INSERT INTO #temp VALUES ('03','002',1,0,0)
INSERT INTO #temp VALUES ('03','003',0,0,0)
INSERT INTO #temp VALUES ('03','004',1,0,0)
INSERT INTO #temp VALUES ('04','001',0,1,0)
INSERT INTO #temp VALUES ('04','002',0,1,0)
INSERT INTO #temp VALUES ('04','003',1,0,0)
INSERT INTO #temp VALUES ('04','004',0,0,1)
INSERT INTO #temp VALUES ('05','001',1,0,0)
INSERT INTO #temp VALUES ('05','002',0,0,1)
INSERT INTO #temp VALUES ('05','003',0,0,0)
INSERT INTO #temp VALUES ('05','004',0,0,1)
INSERT INTO #temp VALUES ('06','001',0,0,0)
INSERT INTO #temp VALUES ('06','002',0,1,0)
INSERT INTO #temp VALUES ('06','003',0,1,0)
INSERT INTO #temp VALUES ('06','004',0,0,0)
INSERT INTO #temp VALUES ('07','001',0,1,0)
INSERT INTO #temp VALUES ('07','002',0,1,0)
INSERT INTO #temp VALUES ('07','003',1,0,0)
INSERT INTO #temp VALUES ('07','004',0,0,1)
INSERT INTO #temp VALUES ('08','001',0,0,1)
INSERT INTO #temp VALUES ('08','002',0,0,1)
INSERT INTO #temp VALUES ('08','003',1,0,0)
INSERT INTO #temp VALUES ('08','004',1,0,0)
INSERT INTO #temp VALUES ('08','005',0,0,1)
CREATE TABLE #temp2
(
consecutivo VARCHAR(20),
fecha datetime
)
INSERT INTO #temp2 VALUES ('01','2013-11-01')
INSERT INTO #temp2 VALUES ('02','2013-11-02')
INSERT INTO #temp2 VALUES ('03','2013-11-03')
INSERT INTO #temp2 VALUES ('04','2013-11-04')
INSERT INTO #temp2 VALUES ('05','2013-11-05')
INSERT INTO #temp2 VALUES ('06','2013-11-06')
INSERT INTO #temp2 VALUES ('07','2013-11-07')
INSERT INTO #temp2 VALUES ('08','2013-11-08')
DECLARE @inicial DATE
DECLARE @inicial2 DATE
DECLARE @final DATE
DECLARE @x INT
DECLARE @dias INT
DECLARE @pivot VARCHAR(MAX)
DECLARE @header VARCHAR(MAX)
SET @inicial='2013-11-01'
SET @inicial2=@inicial
SET @final='2013-11-08'
SET @dias=datediff(dd,@inicial,@final)
SET @pivot=''
SET @header=''
SET @x=1
WHILE @x<=@dias
BEGIN
SET @pivot=@pivot + '[' + REPLACE(CONVERT(VARCHAR(20),@inicial,111),'/','-') + '],'
SET @header=@header + 'sum(' + '[' + REPLACE(CONVERT(VARCHAR(20),@inicial,111),'/','-') + ']) as ' + '[' + REPLACE(CONVERT(VARCHAR(20),@inicial,111),'/','-') + '],'
SET @inicial=dateadd(dd,1,@inicial)
IF @dias=@x
BEGIN
SET @pivot=@pivot + '[' + REPLACE(CONVERT(VARCHAR(20),@inicial,111),'/','-') + ']'
SET @header=@header + 'sum(' + '[' + REPLACE(CONVERT(VARCHAR(20),@inicial,111),'/','-') + ']) as ' + '[' + REPLACE(CONVERT(VARCHAR(20),@inicial,111),'/','-') + ']'
END
SET @x=@x+1
END
DECLARE @query Nvarchar(MAX)
SET @query=
'SELECT trabajador,' + @header + '
FROM
(
SELECT trabajador,' + @pivot +' FROM
(
SELECT t1.consecutivo,t1.trabajador,
case
when labor1=1 then 1
when labor2=1 then 2
when labor3=1 then 3
else 4
end as labor, fecha
FROM #temp as t1
LEFT JOIN #temp2 AS t2 ON (t1.consecutivo=t2.consecutivo)
WHERE fecha BETWEEN ' + CHAR(39) + REPLACE(CONVERT(VARCHAR(20),@inicial2,111),'/','-') + CHAR(39) + ' and ' + CHAR(39) + REPLACE(CONVERT(VARCHAR(20),@final,111),'/','-') + CHAR(39) + '
) AS source
pivot
(
max(labor) FOR fecha IN (' + @pivot +')
) AS pvt
) AS t1 group by trabajador'
EXEC sp_executesql @query
El problema radica en querer saber cuantas veces el trabajador realiza las diferentes labores, en resumen lo que busco es que el resultado sea el siguiente:
trabajador |2013-11-01 |2013-11-02 |2013-11-03 |2013-11-04 |2013-11-05 |2013-11-06 |2013-11-07 |2013-11-08|labor1|labor2|labor3|sinlabor|
001 |1|3|1|2|1|4|2|3|3|2|2|1
002 |2|4|1|2|3|2|2|1|2|3|1|1
003 |3|2|4|1|4|2|1|1|3|2|0|2
004 |2|1|1|3|3|4|3|1|3|0|3|1
005 |N|N|N|N|N|N|N|3|0|0|1|4
Al ingresar bien sea la funcion count o la funcion sum en alguna de las labores me arroja como resultado 1, lo cual es es un fallo.
Agradezco la ayuda que me puedan brindar con respecto a este tema.