none
Como fazer esta select RRS feed

  • Pergunta

  • Opa a todos,

    Pessoal preciso de uma grande ajuda de vocês para montar uma select.

    Tenho 2 tabelas:

    Tabela 1: Produtos

    ID, Nome, Preco

    Tabela 2: Categorias

    ID, Nome

    Preciso montar uma select que sortei 4 categorias e coloque o produto desta categoria que tenha o meno preco, mas se o produto escolhido o preco for zero deve ir para o proximo. Caso nesta categoria nao tenha nenhum produto ou todos estejam com o valor zero devera ser sorteado outra categoria.

    Obrigado

    quinta-feira, 11 de agosto de 2011 16:06

Respostas

  • joão

    segue um exemplo com CTE

    declare @Categorias table (id int identity(1,1), nome varchar(20))
    insert into @Categorias values ('Vestuario'),('Eletronicos'),('alimentacao'),('Bebida'),('Automovel')
    declare @Produtos table (id int identity(1,1), nome varchar(20), preco decimal(5,2), idCategoria int)
    insert into @Produtos values('Calça',0,1),('camisa',10.50,1),('Xbox',0,2),('wii',0.10,2),('Lagosta',null,3),('Batatas',null,3),('Civic',70.000,5),('I30',0.50,5)
    
    
    ;with cte_categoria as
    (
    select *,cast(cast(newid()as varbinary)as int) as 'randomico' from @Categorias where id in (select idCategoria from @Produtos where preco >0))
    , cte_categoria2 as (select top 4 * from cte_categoria order by randomico)
    , cte_menorprod as (select a.nome as 'nomeCategoria',a.randomico,b.*,ROW_NUMBER() over (partition by idCategoria order by preco)as 'numracao' from cte_categoria2 a inner join @Produtos b on a.id=b.idCategoria where preco >0 )
    
    select * from cte_menorprod order by randomico
    


    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    • Sugerido como Resposta Eder Costa terça-feira, 16 de agosto de 2011 15:27
    • Marcado como Resposta Eder Costa quinta-feira, 18 de agosto de 2011 14:48
    quinta-feira, 11 de agosto de 2011 16:37
    Moderador
  • E um exemplo sem CTE =)

     

    --CRIA TABELA PRODUTOS

    CREATE TABLE Produtos(

    ID INT IDENTITY(1,1),

    ID_CATEGORIA INT,

    Nome VARCHAR(100),

    Preco MONEY

    )

     

    --CRIA TABELA CATEGORIAS

    CREATE TABLE Categorias(

    ID INT IDENTITY(1,1),

    Categoria VARCHAR(100)

    )

     

    --INSERTE DADOS

    INSERT INTO Produtos(ID_CATEGORIA,Nome,Preco) VALUES

    (1,'Carrinho Azul', 50.50),

    (2,'Bola Azul', 60.50),

    (3,'Peão azul', 70.50),

    (1,'Carrinho Verde', 80.50),

    (2,'Bola Verde', 90.50),

    (1,'Carrinho Vermelho', 100.50)

    INSERT INTO Categorias(Categoria) VALUES

    ('Carrinhos'),

    ('Bolas'),

    ('Outros')

     

    SELECT TOP 4 a.ID, MIN(b.Preco) AS Preco

    FROM Categorias a INNER JOIN Produtos b ON (a.ID = b.ID_CATEGORIA)

    GROUP BY a.ID

    ORDER BY NEWID()


    Fabrizzio A. Caputo
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    • Sugerido como Resposta Eder Costa terça-feira, 16 de agosto de 2011 15:27
    • Marcado como Resposta Eder Costa quinta-feira, 18 de agosto de 2011 14:48
    quinta-feira, 11 de agosto de 2011 16:41
    Moderador

Todas as Respostas

  • joão

    segue um exemplo com CTE

    declare @Categorias table (id int identity(1,1), nome varchar(20))
    insert into @Categorias values ('Vestuario'),('Eletronicos'),('alimentacao'),('Bebida'),('Automovel')
    declare @Produtos table (id int identity(1,1), nome varchar(20), preco decimal(5,2), idCategoria int)
    insert into @Produtos values('Calça',0,1),('camisa',10.50,1),('Xbox',0,2),('wii',0.10,2),('Lagosta',null,3),('Batatas',null,3),('Civic',70.000,5),('I30',0.50,5)
    
    
    ;with cte_categoria as
    (
    select *,cast(cast(newid()as varbinary)as int) as 'randomico' from @Categorias where id in (select idCategoria from @Produtos where preco >0))
    , cte_categoria2 as (select top 4 * from cte_categoria order by randomico)
    , cte_menorprod as (select a.nome as 'nomeCategoria',a.randomico,b.*,ROW_NUMBER() over (partition by idCategoria order by preco)as 'numracao' from cte_categoria2 a inner join @Produtos b on a.id=b.idCategoria where preco >0 )
    
    select * from cte_menorprod order by randomico
    


    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    • Sugerido como Resposta Eder Costa terça-feira, 16 de agosto de 2011 15:27
    • Marcado como Resposta Eder Costa quinta-feira, 18 de agosto de 2011 14:48
    quinta-feira, 11 de agosto de 2011 16:37
    Moderador
  • E um exemplo sem CTE =)

     

    --CRIA TABELA PRODUTOS

    CREATE TABLE Produtos(

    ID INT IDENTITY(1,1),

    ID_CATEGORIA INT,

    Nome VARCHAR(100),

    Preco MONEY

    )

     

    --CRIA TABELA CATEGORIAS

    CREATE TABLE Categorias(

    ID INT IDENTITY(1,1),

    Categoria VARCHAR(100)

    )

     

    --INSERTE DADOS

    INSERT INTO Produtos(ID_CATEGORIA,Nome,Preco) VALUES

    (1,'Carrinho Azul', 50.50),

    (2,'Bola Azul', 60.50),

    (3,'Peão azul', 70.50),

    (1,'Carrinho Verde', 80.50),

    (2,'Bola Verde', 90.50),

    (1,'Carrinho Vermelho', 100.50)

    INSERT INTO Categorias(Categoria) VALUES

    ('Carrinhos'),

    ('Bolas'),

    ('Outros')

     

    SELECT TOP 4 a.ID, MIN(b.Preco) AS Preco

    FROM Categorias a INNER JOIN Produtos b ON (a.ID = b.ID_CATEGORIA)

    GROUP BY a.ID

    ORDER BY NEWID()


    Fabrizzio A. Caputo
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    • Sugerido como Resposta Eder Costa terça-feira, 16 de agosto de 2011 15:27
    • Marcado como Resposta Eder Costa quinta-feira, 18 de agosto de 2011 14:48
    quinta-feira, 11 de agosto de 2011 16:41
    Moderador
  • Joao Nivaldo,

    Tenta  alguma coisa dese tipo:

    Coloquei esse Group BY pois pode ter algum 2 produtos de mesma categoria com preços igauis e esse preço ser o menor preço da categoria.

    select top 4
        c.nome as categoria, p.preco, min(p.Nome) as produto   
    from
        categorias c
        inner join
        (select
            categoriaId, min(preco) preco
        from
            produtos p       
        where
            p.preco <>0
        group by
            categoriaid
        ) minpreco
            on minpreco.categoriaid = c.id
        inner join
            produtos p
        on p.categoriaid = c.id and p.preco = minpreco.preco
    group by
        c.Nome, p.preco

    sexta-feira, 12 de agosto de 2011 01:21