none
Como Indexar intercalado por sexo: F e M - na Ordem de Peso(Tipo). RRS feed

Respostas

  • Segue exemplo:

    Create Table #TabelaPrincipal (Id int Identity, Nome VarChar(20), Sexo Char(01), Peso Tinyint)
    Insert Into #TabelaPrincipal Values
    ('Juliana', 'F', 2),
    ('Maristela', 'F', 1),
    ('João', 'M', 7),
    ('Perla', 'F', 4),
    ('Renan', 'M', 10),
    ('Helio', 'M', 20),
    ('Sonia', 'F', 5),
    ('Eduardo', 'M', 4),
    ('Maria Helena', 'F', 3),
    ('José', 'M', 90)
    
    -- Feminino
    Select
      IdAux = Identity(int, 1, 2),
      Nome, Sexo, Peso
    Into
      #TabelaFeminino
    From
      #TabelaPrincipal
    Where
      (Sexo = 'F')
    Order by
      Peso
    
    -- Masculino
    Select
      IdAux = Identity(int, 2, 2),
      Nome, Sexo, Peso
    Into
      #TabelaMasculino
    From
      #TabelaPrincipal
    Where
      (Sexo = 'M')
    Order by
      Peso
    
    
    Select * From #TabelaFeminino
    Union
    Select * From #TabelaMasculino
    Order by IdAux


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.


    quarta-feira, 10 de outubro de 2012 16:45
    Moderador
  • João, segue sugestão:

    -- declarando uma tabela temporária
    declare @tb as table 
    (
    	id int,
    	Nome varchar(80),
    	Sexo char(1),
    	Peso tinyint
    )
    
    -- populando a tabela
    insert into @tb values 
    (1,'Juliana', 'F',2),
    (2,'Maristela', 'F',1),
    (3,'João', 'M',7),
    (4,'Perla', 'F',4),
    (5,'Renan', 'M',10),
    (6,'Hélio', 'M',20),
    (7,'Sônia', 'F',5),
    (8,'Eduardo', 'M',4),
    (9,'Maria Helena', 'F',3),
    (10,'José', 'M',90)
    
    --select final
    SELECT 
        Id, Nome, Sexo, Peso
    FROM
    (
        SELECT 
            *,        
            ROW_NUMBER() OVER (PARTITION BY Sexo ORDER BY Peso) as N
        FROM @TB
    ) AS X    
    ORDER BY 
        N, Sexo
        
    /*
    (10 linha(s) afetadas)
    
    Id	Nome	       Sexo	Peso
    2	Maristela	F	1
    8	Eduardo 	M	4
    1	Juliana	        F	2
    3	João	        M	7
    9	Maria Helena	F	3
    5	Renan	        M	10
    4	Perla	        F	4
    6	Hélio	        M	20
    7	Sônia	        F	5
    10	José	        M	90
    */    


    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino

    • Marcado como Resposta João Neves quinta-feira, 11 de outubro de 2012 21:43
    quarta-feira, 10 de outubro de 2012 16:51
  • OK.

    É só clicar em "Marcar como Resposta", nos posts que serviram exatamente como resposta à sua questão.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta João Neves quinta-feira, 11 de outubro de 2012 21:44
    quinta-feira, 11 de outubro de 2012 16:52
    Moderador

Todas as Respostas

  • João, não acho que isto é possivel, para criar um indice fisico (clustered) o indice pode sim conter varias colunas, mas acho que não teria como intercalar uma ordenação entre 2 colunas, teria que ser 1 e depois a outra.

    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 10 de outubro de 2012 16:03
  • Segue exemplo:

    Create Table #TabelaPrincipal (Id int Identity, Nome VarChar(20), Sexo Char(01), Peso Tinyint)
    Insert Into #TabelaPrincipal Values
    ('Juliana', 'F', 2),
    ('Maristela', 'F', 1),
    ('João', 'M', 7),
    ('Perla', 'F', 4),
    ('Renan', 'M', 10),
    ('Helio', 'M', 20),
    ('Sonia', 'F', 5),
    ('Eduardo', 'M', 4),
    ('Maria Helena', 'F', 3),
    ('José', 'M', 90)
    
    -- Feminino
    Select
      IdAux = Identity(int, 1, 2),
      Nome, Sexo, Peso
    Into
      #TabelaFeminino
    From
      #TabelaPrincipal
    Where
      (Sexo = 'F')
    Order by
      Peso
    
    -- Masculino
    Select
      IdAux = Identity(int, 2, 2),
      Nome, Sexo, Peso
    Into
      #TabelaMasculino
    From
      #TabelaPrincipal
    Where
      (Sexo = 'M')
    Order by
      Peso
    
    
    Select * From #TabelaFeminino
    Union
    Select * From #TabelaMasculino
    Order by IdAux


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.


    quarta-feira, 10 de outubro de 2012 16:45
    Moderador
  • João, segue sugestão:

    -- declarando uma tabela temporária
    declare @tb as table 
    (
    	id int,
    	Nome varchar(80),
    	Sexo char(1),
    	Peso tinyint
    )
    
    -- populando a tabela
    insert into @tb values 
    (1,'Juliana', 'F',2),
    (2,'Maristela', 'F',1),
    (3,'João', 'M',7),
    (4,'Perla', 'F',4),
    (5,'Renan', 'M',10),
    (6,'Hélio', 'M',20),
    (7,'Sônia', 'F',5),
    (8,'Eduardo', 'M',4),
    (9,'Maria Helena', 'F',3),
    (10,'José', 'M',90)
    
    --select final
    SELECT 
        Id, Nome, Sexo, Peso
    FROM
    (
        SELECT 
            *,        
            ROW_NUMBER() OVER (PARTITION BY Sexo ORDER BY Peso) as N
        FROM @TB
    ) AS X    
    ORDER BY 
        N, Sexo
        
    /*
    (10 linha(s) afetadas)
    
    Id	Nome	       Sexo	Peso
    2	Maristela	F	1
    8	Eduardo 	M	4
    1	Juliana	        F	2
    3	João	        M	7
    9	Maria Helena	F	3
    5	Renan	        M	10
    4	Perla	        F	4
    6	Hélio	        M	20
    7	Sônia	        F	5
    10	José	        M	90
    */    


    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino

    • Marcado como Resposta João Neves quinta-feira, 11 de outubro de 2012 21:43
    quarta-feira, 10 de outubro de 2012 16:51
  • João, se você puder usar o Row_Number (se sua versão de SQL permitir), seria bem melhor.

    Mas neste caso Leonardo, acho que poderíamos acoplar uma CTE ao seu exemplo, pra ficar 100%:

    declare @tb as table 
    (
    	id int,
    	Nome varchar(80),
    	Sexo char(1),
    	Peso tinyint
    )
    
    -- populando a tabela
    insert into @tb values 
    (1,'Juliana', 'F',2),
    (2,'Maristela', 'F',1),
    (3,'João', 'M',7),
    (4,'Perla', 'F',4),
    (5,'Renan', 'M',10),
    (6,'Hélio', 'M',20),
    (7,'Sônia', 'F',5),
    (8,'Eduardo', 'M',4),
    (9,'Maria Helena', 'F',3),
    (10,'José', 'M',90)
    
    --select final
    ;With CTE as
    (SELECT *, IdAux = ROW_NUMBER() OVER (PARTITION BY Sexo ORDER BY Peso) FROM @tb)
    Select IdAux, id, Nome, Sexo, Peso FROM CTE ORDER BY IdAux, Peso

    Mas se a versão do SQL que estiver usando for 2000 ou inferior, aí só criando colunas Identity (conforme meu primeiro exemplo).


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 10 de outubro de 2012 17:08
    Moderador
  • Obrigado foi muito útil mesmo.
    Não sei como classificar mas cliquei no "já votado".
    quarta-feira, 10 de outubro de 2012 21:24
  • Obrigado foi muito útil mesmo. Express 2008
    Não sei como classificar mas cliquei no "já votado".
    quarta-feira, 10 de outubro de 2012 21:25
  • Obrigado foi muito útil mesmo.
    Não sei como classificar mas cliquei no "já votado".
    quarta-feira, 10 de outubro de 2012 21:26
  • OK.

    É só clicar em "Marcar como Resposta", nos posts que serviram exatamente como resposta à sua questão.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta João Neves quinta-feira, 11 de outubro de 2012 21:44
    quinta-feira, 11 de outubro de 2012 16:52
    Moderador
  • João segue mais um exemplo, caso seu sql seja 2000 ou inferior.

    Create Table #TabelaPrincipal (Id int Identity, Nome VarChar(20), Sexo Char(01), Peso Tinyint)
    Insert Into #TabelaPrincipal Values
    ('Juliana', 'F', 2),
    ('Maristela', 'F', 1),
    ('João', 'M', 7),
    ('Perla', 'F', 4),
    ('Renan', 'M', 10),
    ('Helio', 'M', 20),
    ('Sonia', 'F', 5),
    ('Eduardo', 'M', 4),
    ('Maria Helena', 'F', 3),
    ('José', 'M', 90)
    
    
    SELECT 
          Id, Nome, Sexo, Peso 
    FROM
    (
        Select
          Id, Nome, Sexo, Peso,
          N = (SELECT COUNT(B.ID) FROM #TabelaPrincipal AS B WHERE B.SEXO = A.SEXO AND B.PESO <=A.PESO)
        From
          #TabelaPrincipal AS A
    ) AS X
    Order by
      N, SEXO



    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino

    quinta-feira, 11 de outubro de 2012 18:27