Usuário com melhor resposta
Unir varias SQL

Pergunta
-
Amigos Boa Tarde!
Preciso unir varias SQL, porem o resulto individual de casa uma me retorna o que de fato eu preciso, porem no momento de uniar a coluna que deveria somar SOMA todo resultado e não por SECAO.
Vejam como estou fazendo.
1 SQL
SELECT
CODCOLIGADA,
ANO,
MES,
CODIGO,
DESCRICAO,
SUM(ADM) ADMITIDOS,
SUM(DEM) DEMITIDOS,
( SELECT COUNT(A.CHAPA)
FROM PFUNC A
LEFT JOIN PFRATEIOFIXO B ON A.CODCOLIGADA = B.CODCOLIGADA AND A.CHAPA = B.CHAPA
WHERE A.CODCOLIGADA = TURNOVER.CODCOLIGADA
AND A.DATAADMISSAO < CONVERT(DATETIME,TURNOVER.ANO+'-'+TURNOVER.MES+'-'+'01')
AND (A.CODSITUACAO <> 'D' OR ( A.CODSITUACAO = 'D' AND A.DATADEMISSAO >
CONVERT(DATETIME,TURNOVER.ANO+'-'+TURNOVER.MES+'-'+'01')))
AND A.CODCOLIGADA = TURNOVER.CODCOLIGADA
AND A.CODSECAO = TURNOVER.CODIGO
) AS FUNC_INICIO_MES,
( SELECT COUNT(A.CHAPA)
FROM PFUNC A
LEFT JOIN PFRATEIOFIXO B ON A.CODCOLIGADA = B.CODCOLIGADA AND A.CHAPA = B.CHAPA
WHERE A.CODCOLIGADA = TURNOVER.CODCOLIGADA
AND A.DATAADMISSAO <= DATEADD(D,-1, DATEADD(M,1,CONVERT(DATETIME,TURNOVER.ANO+'-'+TURNOVER.MES+'-'+'01')))
AND (A.CODSITUACAO <> 'D' OR (CODSITUACAO = 'D'
AND A.DATADEMISSAO > DATEADD(D,-1, DATEADD(M,1,CONVERT(DATETIME,TURNOVER.ANO+'-'+TURNOVER.MES+'-'+'01')))))
AND A.CODSECAO = TURNOVER.CODIGO
) AS FUNC_FIM_MES
FROM (
SELECT
P.CODCOLIGADA,
S.CODIGO,
S.DESCRICAO,
CAST(MONTH(P.DATAADMISSAO) AS VARCHAR(2)) MES,
CAST(YEAR(P.DATAADMISSAO) AS VARCHAR(4)) ANO,
COUNT(P.CHAPA) ADM,
0 DEM
FROM PFUNC P
LEFT JOIN PFRATEIOFIXO R ON P.CODCOLIGADA = R.CODCOLIGADA AND P.CHAPA = R.CHAPA
LEFT JOIN GCCUSTO G ON R.CODCOLIGADA = G.CODCOLIGADA AND R.CODCCUSTO = G.CODCCUSTO
left join PSECAO AS S ON S.CODCOLIGADA = p.CODCOLIGADA AND S.CODIGO = P.CODSECAO
WHERE P.CODCOLIGADA ='9'
AND YEAR (P.DATAADMISSAO) = '2016'
GROUP BY P.CODCOLIGADA, S.CODIGO, S.DESCRICAO,
CAST(MONTH(P.DATAADMISSAO) AS VARCHAR(2)), CAST(YEAR(P.DATAADMISSAO) AS VARCHAR(4))
UNION ALL
SELECT
P.CODCOLIGADA,
S.CODIGO,
S.DESCRICAO,
CAST(MONTH(P.DATADEMISSAO) AS VARCHAR(2)) MES,
CAST(YEAR(P.DATADEMISSAO) AS VARCHAR(4)) ANO,
0 ADM,
COUNT(P.CHAPA) DEM
FROM PFUNC P
LEFT JOIN PFRATEIOFIXO R ON P.CODCOLIGADA = R.CODCOLIGADA AND P.CHAPA = R.CHAPA
LEFT JOIN GCCUSTO G ON R.CODCOLIGADA = G.CODCOLIGADA AND R.CODCCUSTO = G.CODCCUSTO
left join PSECAO AS S ON S.CODCOLIGADA = p.CODCOLIGADA AND S.CODIGO = P.CODSECAO
WHERE P.CODCOLIGADA = '9'
AND P.CODSITUACAO = 'D'
AND YEAR (P.DATADEMISSAO) = '2016'
GROUP BY P.CODCOLIGADA,
S.CODIGO,
S.DESCRICAO,
CAST(MONTH(P.DATADEMISSAO) AS VARCHAR(2)),
CAST(YEAR(P.DATADEMISSAO) AS VARCHAR(4))
) AS TURNOVER
WHERE TURNOVER.MES = '9'
GROUP BY
CODCOLIGADA,
CODIGO,
DESCRICAO,
ANO,
MESResultado OK e isso mesmo
COD ANO MES CODIGO DESCRIÇÃO ADMI DEM INICIO_MES FIM_MES
9 2016 9 01.001.0.00.001 BELO HORIZONTE 7 0 46 47
9 2016 9 01.002.0.00.001 RIO DE JANEIRO 0 1 2 3
9 2016 9 02.158.0.00.001 OBRA 158 a 2 5 308 304
9 2016 9 02.158.0.00.002 OBRA 158 CI 5 1 282 2942 SQL Resultado OK tb
COD ANO MES CODIGO DESCRICAO LIQUIDO
9 2016 9 01.001.0.00.001 BELO HORIZONTE 153522.91
9 2016 9 01.002.0.00.001 RIO DE JANEIRO 12268.50
9 2016 9 02.158.0.00.001 OBRA 158 A 303594.64
9 2016 9 02.158.0.00.002 OBRA 158 CI 356690.65Porem eu preciso UNIR a SQL 1 + a SQL 2, Porem o resultado deve ser o Resultado da Primeira + LIQUIDO da 2 SQL
Eu fiz dessa forma abaixo:
with
/* TUNOVER */
TUNOVER as (
SELECT
CODCOLIGADA,
ANO,
MES,
CODIGO,
DESCRICAO,
SUM(ADM) ADMITIDOS,
SUM(DEM) DEMITIDOS,
( SELECT COUNT(A.CHAPA)
FROM PFUNC A
LEFT JOIN PFRATEIOFIXO B ON A.CODCOLIGADA = B.CODCOLIGADA AND A.CHAPA = B.CHAPA
WHERE A.CODCOLIGADA = TURNOVER.CODCOLIGADA
AND A.DATAADMISSAO < CONVERT(DATETIME,TURNOVER.ANO+'-'+TURNOVER.MES+'-'+'01')
AND (A.CODSITUACAO <> 'D' OR ( A.CODSITUACAO = 'D' AND A.DATADEMISSAO >
CONVERT(DATETIME,TURNOVER.ANO+'-'+TURNOVER.MES+'-'+'01')))
AND A.CODCOLIGADA = TURNOVER.CODCOLIGADA
AND A.CODSECAO = TURNOVER.CODIGO
) AS FUNC_INICIO_MES,
( SELECT COUNT(A.CHAPA)
FROM PFUNC A
LEFT JOIN PFRATEIOFIXO B ON A.CODCOLIGADA = B.CODCOLIGADA AND A.CHAPA = B.CHAPA
WHERE A.CODCOLIGADA = TURNOVER.CODCOLIGADA
AND A.DATAADMISSAO <= DATEADD(D,-1, DATEADD(M,1,CONVERT(DATETIME,TURNOVER.ANO+'-'+TURNOVER.MES+'-'+'01')))
AND (A.CODSITUACAO <> 'D' OR (CODSITUACAO = 'D'
AND A.DATADEMISSAO > DATEADD(D,-1, DATEADD(M,1,CONVERT(DATETIME,TURNOVER.ANO+'-'+TURNOVER.MES+'-'+'01')))))
AND A.CODSECAO = TURNOVER.CODIGO
) AS FUNC_FIM_MES
FROM (
SELECT
P.CODCOLIGADA,
S.CODIGO,
S.DESCRICAO,
CAST(MONTH(P.DATAADMISSAO) AS VARCHAR(2)) MES,
CAST(YEAR(P.DATAADMISSAO) AS VARCHAR(4)) ANO,
COUNT(P.CHAPA) ADM,
0 DEM
FROM PFUNC P
LEFT JOIN PFRATEIOFIXO R ON P.CODCOLIGADA = R.CODCOLIGADA AND P.CHAPA = R.CHAPA
LEFT JOIN GCCUSTO G ON R.CODCOLIGADA = G.CODCOLIGADA AND R.CODCCUSTO = G.CODCCUSTO
left join PSECAO AS S ON S.CODCOLIGADA = p.CODCOLIGADA AND S.CODIGO = P.CODSECAO
WHERE P.CODCOLIGADA ='9'
AND YEAR (P.DATAADMISSAO) = '2016'
GROUP BY P.CODCOLIGADA, S.CODIGO, S.DESCRICAO,
CAST(MONTH(P.DATAADMISSAO) AS VARCHAR(2)), CAST(YEAR(P.DATAADMISSAO) AS VARCHAR(4))
UNION ALL
SELECT
P.CODCOLIGADA,
S.CODIGO,
S.DESCRICAO,
CAST(MONTH(P.DATADEMISSAO) AS VARCHAR(2)) MES,
CAST(YEAR(P.DATADEMISSAO) AS VARCHAR(4)) ANO,
0 ADM,
COUNT(P.CHAPA) DEM
FROM PFUNC P
LEFT JOIN PFRATEIOFIXO R ON P.CODCOLIGADA = R.CODCOLIGADA AND P.CHAPA = R.CHAPA
LEFT JOIN GCCUSTO G ON R.CODCOLIGADA = G.CODCOLIGADA AND R.CODCCUSTO = G.CODCCUSTO
left join PSECAO AS S ON S.CODCOLIGADA = p.CODCOLIGADA AND S.CODIGO = P.CODSECAO
WHERE P.CODCOLIGADA = '9'
AND P.CODSITUACAO = 'D'
AND YEAR (P.DATADEMISSAO) = '2016'
GROUP BY P.CODCOLIGADA,
S.CODIGO,
S.DESCRICAO,
CAST(MONTH(P.DATADEMISSAO) AS VARCHAR(2)),
CAST(YEAR(P.DATADEMISSAO) AS VARCHAR(4))
) AS TURNOVER
WHERE TURNOVER.MES = '9'
GROUP BY
CODCOLIGADA,
CODIGO,
DESCRICAO,
ANO,
MES
),
LiquidoFolha as (
SELECT
F.CODCOLIGADA,
PFPERFF.ANOCOMP ANO,
PFPERFF.MESCOMP MES,
S.CODIGO,
S.DESCRICAO,
SUM(LIQUIDO)LIQUIDO
from PFPERFF
inner join PFUNC AS F ON F.CODCOLIGADA = PFPERFF.CODCOLIGADA and F.CHAPA = PFPERFF.CHAPA
left join PSECAO AS S ON S.CODCOLIGADA = F.CODCOLIGADA AND S.CODIGO = F.CODSECAO
where NROPERIODO = '4'
and PFPERFF.ANOCOMP = '2016'
AND PFPERFF.MESCOMP = '9'
and PFPERFF.CODCOLIGADA = '9'
GROUP BY PFPERFF.MESCOMP,S.CODIGO,F.CODCOLIGADA,PFPERFF.ANOCOMP,
S.DESCRICAO
)
/* RESULTADO FINAL */
SELECT
T1.MES,
T1.CODIGO,
T1.DESCRICAO,
T1.ADMITIDOS,
T1.DEMITIDOS,
T1.FUNC_INICIO_MES,
T1.FUNC_FIM_MES,
SUM(T2.LIQUIDO)
from TUNOVER as T1
LEFT join LiquidoFolha AS T2 ON T2.MES = T1.MES
WHERE T1.MES = '9'
AND T1.MES = '9'
GROUP BY
T1.MES,
T1.CODIGO,
T1.DESCRICAO,
T1.ADMITIDOS,
T1.DEMITIDOS,
T1.FUNC_INICIO_MES,
T1.FUNC_FIM_MES
ORDER BY T1.MESPorem ele Soma o Valor Liquido TOTAL ESTA Somando total.
MES CODIGO DESCRIÇÃO ADM DEM INICIO_MES FIM_MES LIQUIDO
9 01.001.0.00.001 BELO HORIZONTE 7 0 46 47 826076.70
9 01.002.0.00.001 RIO DE JANEIRO 0 1 2 3 826076.70
9 02.158.0.00.001 OBRA 158 A 2 5 308 304 826076.70
9 02.158.0.00.002 OBRA 158 CI 5 1 282 294 826076.70
Respostas
-
Porem eu preciso UNIR a SQL 1 + a SQL 2, Porem o resultado deve ser o Resultado da Primeira + LIQUIDO da 2 SQL
vou te dar uma abordagem que resolve seu problema de forma simples, outras abordagens podem também existir,
inicialmente
1)vc só vai conseguir unir( Union ou Union All), se a estrutura do seu resultado for o mesmo em ambos.
seu primeiro Select retorna os campos
cod int, Ano int, Mes int, Codigo varchar(max), Descricao varchar(max), ADMI int, DEM int, Inicio_Mes int, FIM_MES int,
seu segundo select retorna os campos
cod int, Ano int, Mes int, Codigo varchar(max), Descricao varchar(max),Liquido decimal(18,2)
o operador Union necessariamente pede dois resultados com a mesma quantidade de campos e mesmo tipo de dados
logo veja a solução que fiz
1) declarei uma variável table com o resultado do primeiro select postado e para o campo LIQUIDO coloquei o valor ZERO
declare @ResultadoDoPrimeiroSelect table( cod int, Ano int, Mes int, Codigo varchar(max), Descricao varchar(max), ADMI int, DEM int, Inicio_Mes int, FIM_MES int, Liquido decimal(18,2) ) --Resultado OK e isso mesmo insert into @ResultadoDoPrimeiroSelect values (9, 2016, 9,'01.001.0.00.001', 'BELO HORIZONTE', 7, 0, 46, 47,0), (9, 2016, 9,'01.002.0.00.001', 'RIO DE JANEIRO', 0,1,2 ,3,0), (9, 2016, 9,'02.158.0.00.001', 'OBRA 158 a', 2 ,5 ,308 ,304,0), (9, 2016, 9,'02.158.0.00.002', 'OBRA 158 CI', 5 ,5 ,282 ,294,0);
agora para o resultado do seu segundo select fiz a mesma coisa ,porem para os outros campos que vc retorna
declare @ResultadoDoSegundoSelect table( cod int, Ano int, Mes int, Codigo varchar(max), Descricao varchar(max), ADMI int, DEM int, Inicio_Mes int, FIM_MES int, Liquido decimal(18,2) ) insert into @ResultadoDoSegundoSelect values (9, 2016, 9,'01.001.0.00.001', 'BELO HORIZONTE',0,0,0,0, 153522.91), (9, 2016, 9,'01.002.0.00.001', 'RIO DE JANEIRO',0,0,0,0, 12268.50), (9, 2016, 9,'02.158.0.00.001', 'OBRA 158 a', 0,0,0,0,303594.64), (9, 2016, 9,'02.158.0.00.002', 'OBRA 158 CI',0,0,0,0, 356690.65);
agora vejamos nos temos duas tabelas com a mesma estruturas .
agora vc pode criar o resultado final fazendo assim
select
Retorno.cod ,
Retorno.Ano ,
Retorno.Mes ,
Retorno.Codigo,
Retorno.Descricao ,
Sum(Retorno.ADMI) ADMI,
Sum(Retorno.DEM) DEM,
Sum(Retorno.Inicio_Mes) Inicio_Mes,
Sum(Retorno.FIM_MES) FIM_MES,
Sum(Retorno.Liquido) Liquido
from (
select * from @ResultadoDoPrimeiroSelect
union all
select * from @ResultadoDoSegundoSelect)as Retorno
group by
cod ,
Ano ,
Mes ,
Codigo,
Descricao--Simples e direito
Wesley Neves
- Editado Wesley Neves domingo, 6 de novembro de 2016 18:21 correção
- Marcado como Resposta Filipe B CastroModerator terça-feira, 10 de abril de 2018 19:48