Jump to content
Fórum Script Brasil
  • 0

Retornar só quando todos os valores forem iguais


jotafe

Question

Caros,

Tenho a seguinte situação, uma lista de funcionários, projetos e status.

Eu preciso de uma query que me retorne o nome do Funcionário, somente quando todos os status de seus projetos forem 100%

Ex.:

Func Projeto Status

João Projeto 1 100,00%

João Projeto 2 50,00%

João Projeto 3 50,00%

João Projeto 4 100,00%

Maria Projeto 5 100,00%

Maria Projeto 6 100,00%

Maria Projeto 7 100,00%

Maria Projeto 8 100,00%

José Projeto 9 50,00%

José Projeto 10 50,00%

José Projeto 11 50,00%

José Projeto 12 50,00%

No caso acima, a query so retornaria somente o nome da Maria.

Se precisarem de mais informações me digam.

Obrigado desde já.

João Fábio

Link to comment
Share on other sites

10 answers to this question

Recommended Posts

  • 0

Bom dia João Fábio,

Para fazer isto, terá que pegar todas as ocorrências e verificar se elas estão todas com 100%. Terá que utilizar uma forma de comparação, para retornar o valor desejado.

Fiz um exemplo logo abaixo e espero que ajude:

-- criação de temporária
CREATE table #tabela (Func varchar(10), Projeto varchar(20), STATUS INT)  

-- inserção dos dados
INSERT INTO #tabela VALUES ('João','Projeto 1', 100)
INSERT INTO #tabela VALUES ('João','Projeto 2', 50)
INSERT INTO #tabela VALUES ('João','Projeto 3', 50)
INSERT INTO #tabela VALUES ('João','Projeto 4', 100)
INSERT INTO #tabela VALUES ('Maria','Projeto 5', 100)
INSERT INTO #tabela VALUES ('Maria','Projeto 6', 100)
INSERT INTO #tabela VALUES ('Maria','Projeto 7', 100)
INSERT INTO #tabela VALUES ('Maria','Projeto 8', 100)
INSERT INTO #tabela VALUES ('José','Projeto 9', 50)
INSERT INTO #tabela VALUES ('José','Projeto 10', 50)
INSERT INTO #tabela VALUES ('José','Projeto 11', 50)
INSERT INTO #tabela VALUES ('José','Projeto 12', 50)

-- verificação
SELECT * FROM #tabela

-- select com resultado desejado
SELECT Func FROM #tabela GROUP BY Func HAVING SUM(STATUS)=count(STATUS)*100

Link to comment
Share on other sites

  • 0
Bom dia João Fábio,

Para fazer isto, terá que pegar todas as ocorrências e verificar se elas estão todas com 100%. Terá que utilizar uma forma de comparação, para retornar o valor desejado.

Fiz um exemplo logo abaixo e espero que ajude:

-- criação de temporária
CREATE table #tabela (Func varchar(10), Projeto varchar(20), STATUS INT)  

-- inserção dos dados
INSERT INTO #tabela VALUES ('João','Projeto 1', 100)
INSERT INTO #tabela VALUES ('João','Projeto 2', 50)
INSERT INTO #tabela VALUES ('João','Projeto 3', 50)
INSERT INTO #tabela VALUES ('João','Projeto 4', 100)
INSERT INTO #tabela VALUES ('Maria','Projeto 5', 100)
INSERT INTO #tabela VALUES ('Maria','Projeto 6', 100)
INSERT INTO #tabela VALUES ('Maria','Projeto 7', 100)
INSERT INTO #tabela VALUES ('Maria','Projeto 8', 100)
INSERT INTO #tabela VALUES ('José','Projeto 9', 50)
INSERT INTO #tabela VALUES ('José','Projeto 10', 50)
INSERT INTO #tabela VALUES ('José','Projeto 11', 50)
INSERT INTO #tabela VALUES ('José','Projeto 12', 50)

-- verificação
SELECT * FROM #tabela

-- select com resultado desejado
SELECT Func FROM #tabela GROUP BY Func HAVING SUM(STATUS)=count(STATUS)*100

Agora tenho outro problema seguindo na mesma linha, só que em vez do nome um ID Numerico (INT) e no Status um campo Varchar

Exemplo:

OS >> Complementar >> Status_Complemetar

101 >> 201 >> Fechada

101 >> 202 >> Aberta

101 >> 203 >> Aberta

102 >> 204 >> Fechada

102 >> 205 >> Fechada

102 >> 206 >> Fechada

102 >> 207 >> Fechada

102 >> 208 >> Fechada

103 >> 209 >> Fechada

103 >> 210 >> Aberta

103 >> 211 >> Aberta

103 >> 212 >> Em atendimento

Preciso que retorne somente as OS com todos Status_Complemetar "Fechado"

É possível?

Edited by jotafe
Link to comment
Share on other sites

  • 0

rs... essa aí é mais complexa... mas vamos lá:

-- criação de temporária
CREATE table #tabela (OS int, Complementar INT, Status_Complemetar VARCHAR(10))  

-- inserção dos dados
INSERT INTO #tabela VALUES (101 , 201 , 'Fechada')
INSERT INTO #tabela VALUES (101 , 202 , 'Aberta')
INSERT INTO #tabela VALUES (101 , 203 , 'Aberta')
INSERT INTO #tabela VALUES (102 , 204 , 'Fechada')
INSERT INTO #tabela VALUES (102 , 205 , 'Fechada')
INSERT INTO #tabela VALUES (102 , 206 , 'Fechada')
INSERT INTO #tabela VALUES (102 , 207 , 'Fechada')
INSERT INTO #tabela VALUES (102 , 208 , 'Fechada')
INSERT INTO #tabela VALUES (103 , 209 , 'Fechada')
INSERT INTO #tabela VALUES (103 , 210 , 'Aberta')
INSERT INTO #tabela VALUES (103 , 211 , 'Aberta')
INSERT INTO #tabela VALUES (103 , 212 , 'Em atendimento')

-- verificação
SELECT * FROM #tabela

-- select com resultado desejado
SELECT OS FROM #tabela GROUP BY OS HAVING sum(CASE Status_Complemetar WHEN 'Fechada' THEN 1 ELSE 0 END)=COUNT(os)

Link to comment
Share on other sites

  • 0

Caros, boa tarde!

Estou com o mesmo caso do João Fábio.

Exemplo:

OS, Status

101, Fechado

101, Aberto

101, Fechado

102, Aberto

102, Fechado

103, Fechado

103, Fechado

104, Aberto

104, Aberto

PS. OS INT, Status VARCHAR

Preciso que retorne somente 1 vez o 103 porque todos os 103 tem status fechado os outros não, porque tem pelo menos um aberto.

Desde já agradeço.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...