none
Montar Comando SQL Para Relatório RRS feed

  • Pergunta

  • Olá!

    Sou iniciante em .NET e estou estagiando numa maternidade num módulo de controle de refeições para pacientes.
    Nele, preciso gerar um relatório que retorne o nome da dieta, sua id, e a quantidade desta que foi emitida por mês em um determinado ano fornecido, com o seguinte exemplo:

    Ano: 2013

    | idDieta | nome            | jan | fev | mar |... | total

    | 1          | leite artificial | 2    |  1   |  1    |... | 10

    | 2          | hiposódica    | 2    |  2   |  5    |... | 40

    As tabelas são envolvidas são:
    dbo.Dieta

    CREATE TABLE [dbo].[Dieta](
    	[idDieta] [int] IDENTITY(1,1) NOT NULL,
    	[nome] [varchar](45) NULL,
    	[status] [varchar](10) NULL,
     CONSTRAINT [PK__Dieta__00551192]
    e

    dbo.ControleDieta (idControleDieta, idPaciente, dataCadastro, idDieta1, idDieta2, idDieta3, idDieta4) - Porque cada Dieta em sim, pode ser uma combinação de até 4 tipos de dietas pré-estabelecidas:

    CREATE TABLE [dbo].[ControleDieta](
    	[idControleDieta] [int] IDENTITY(1,1) NOT NULL,
    	[idProntuarioNutricao] [int] NOT NULL,
    	[idDieta1] [int] NOT NULL,
    	[idDieta2] [int] NULL,
    	[idDieta3] [int] NULL,
    	[idDieta4] [int] NULL,
    	[idEspec1] [int] NULL,
    	[idEspec2] [int] NULL,
    	[obsCafe] [varchar](255) NULL,
    	[obsJantar] [varchar](255) NULL,
    	[obsAlmoco] [varchar](255) NULL,
    	[status] [varchar](50) NULL,
    	[operador] [varchar](50) NULL,
    	[dataCadastro] [datetime] NULL,
    	[operadorUltimaAlteracao] [varchar](50) NULL,
    	[dataUltimaAlteracao] [datetime] NULL,
     CONSTRAINT [PK__ControleDieta__023D5A04]



    O Mais próximo que cheguei foi ao seguinte comando :
    <code

    SELECT 
    	d.idDieta, d.nome, ISNULL(CONVERT(varchar(50),jan),0) as jan, ISNULL(CONVERT(varchar(50),fev),0) as fev,
                             ISNULL(CONVERT(varchar(50),mar),0) as mar--, ISNULL(CONVERT(varchar(50),abr),0) as abr,
                             --ISNULL(CONVERT(varchar(50),mai),0) as mai, ISNULL(CONVERT(varchar(50),jun),0) as jun, 
                             --ISNULL(CONVERT(varchar(50),jul),0) as jul, ISNULL(CONVERT(varchar(50),aug),0) as aug, 
                             --ISNULL(CONVERT(varchar(50),sep),0) as sep, ISNULL(CONVERT(varchar(50),oct),0) as oct, 
                             --ISNULL(CONVERT(varchar(50),NOV),0) as nov, ISNULL(CONVERT(varchar(50),DEZ),0) as dez, 
                             --ISNULL(CONVERT(varchar(50),total),0) as total
    FROM dieta d 
    	left join ( SELECT cd.idDieta1, cd.idDieta2, cd.idDieta3, cd.idDieta4, count (cd.idControleDieta) as jan		
    						 FROM controleDieta cd, dieta d
    						 WHERE cd.status = 'Ativo' and 
    								cd.idDieta1 = d.idDieta													
    							and DATEDIFF(MONTH,cd.dataCadastro,'01/01/2013') = 0 
    						 GROUP BY cd.idDieta1, cd.idDieta2, cd.idDieta3, cd.idDieta4) as j
    	ON j.idDieta1 = d.idDieta
    	left join ( SELECT cd.idDieta1, cd.idDieta2, cd.idDieta3, cd.idDieta4, count (cd.idControleDieta) as fev		
    							 FROM controleDieta cd, dieta d
    							 WHERE cd.status = 'Ativo' and 
    									cd.idDieta1 = d.idDieta or 
    									cd.idDieta2 = d.idDieta or
    									cd.idDieta3 = d.idDieta or
    									cd.idDieta4 = d.idDieta														
    								and DATEDIFF(MONTH,cd.dataCadastro,'01/02/2013') = 0 
    							 GROUP BY cd.idDieta1, cd.idDieta2, cd.idDieta3, cd.idDieta4) as f
    	ON f.idDieta1 = d.idDieta
    	left join ( SELECT cd.idDieta1, cd.idDieta2, cd.idDieta3, cd.idDieta4, count (cd.idControleDieta) as mar		
    							 FROM controleDieta cd, dieta d
    							 WHERE cd.status = 'Ativo' and 
    									cd.idDieta1 = d.idDieta or 
    									cd.idDieta2 = d.idDieta or
    									cd.idDieta3 = d.idDieta or
    									cd.idDieta4 = d.idDieta														
    								and DATEDIFF(MONTH,cd.dataCadastro,'01/03/2013') = 0 
    							 GROUP BY cd.idDieta1, cd.idDieta2, cd.idDieta3, cd.idDieta4) as m
    	ON m.idDieta1 = d.idDieta
    Mas infelizmente ainda retorna resultados inconsistentes por exemplo:
    id dieta - nome - jan - fev - mar ...
    6    normal    0    0    0
    7    branda    0    0    0
    8    pastosa    0    1    1
    9    zero    0    0    0
    10    líquida    0    0    0
    11    semi-líquida    0    1    1
    12    hipossódica    0    2    2
    13    p/ diabética    0    0    0
    14    leite humano    0    1    1
    14    leite humano    0    1    2
    14    leite humano    0    2    1
    14    leite humano    0    2    2
    15    leite artificial    0    1    1
    16    líquida gelada    0    0    0
    17    líquida restrita    0    0    0
    18    laxante    0    0    0
    19    obstipante    0    0    0
    20    para hiperêmese gravídica    0    0    0
    21    cardiopata    0    0    0
    22    renal conservador    0    1    1
    23    isenta de glúten    0    0    0
    24    isenta de proteína do leite de vaca    0    0    0

    Peço ajuda a quem puder me ajudar, pois já estou a uma semana apenas trabalhando em cima desse código e o tempo para entrega já esgotou, rs.

    Grato,



    sexta-feira, 8 de novembro de 2013 18:11

Respostas

  • Se você pegar a sua consulta e adicionar um group by ele deve retornar corretamente.

    SELECT idDieta, nome, SUM(jan) as jan, SUM(fev) as fev, SUM(mar) as mar FROM (
    SELECT 
    	d.idDieta, d.nome, ISNULL(jan,0) as jan, ISNULL(fev,0) as fev,
                             ISNULL(mar,0) as mar--, ISNULL(CONVERT(varchar(50),abr),0) as abr,
                             --ISNULL(CONVERT(varchar(50),mai),0) as mai, ISNULL(CONVERT(varchar(50),jun),0) as jun, 
                             --ISNULL(CONVERT(varchar(50),jul),0) as jul, ISNULL(CONVERT(varchar(50),aug),0) as aug, 
                             --ISNULL(CONVERT(varchar(50),sep),0) as sep, ISNULL(CONVERT(varchar(50),oct),0) as oct, 
                             --ISNULL(CONVERT(varchar(50),NOV),0) as nov, ISNULL(CONVERT(varchar(50),DEZ),0) as dez, 
                             --ISNULL(CONVERT(varchar(50),total),0) as total
    FROM dieta d 
    	left join ( SELECT cd.idDieta1, cd.idDieta2, cd.idDieta3, cd.idDieta4, count (cd.idControleDieta) as jan		
    						 FROM controleDieta cd, dieta d
    						 WHERE cd.status = 'Ativo' and 
    								cd.idDieta1 = d.idDieta													
    							and DATEDIFF(MONTH,cd.dataCadastro,'01/01/2013') = 0 
    						 GROUP BY cd.idDieta1, cd.idDieta2, cd.idDieta3, cd.idDieta4) as j
    	ON j.idDieta1 = d.idDieta
    	left join ( SELECT cd.idDieta1, cd.idDieta2, cd.idDieta3, cd.idDieta4, count (cd.idControleDieta) as fev		
    							 FROM controleDieta cd, dieta d
    							 WHERE cd.status = 'Ativo' and 
    									cd.idDieta1 = d.idDieta or 
    									cd.idDieta2 = d.idDieta or
    									cd.idDieta3 = d.idDieta or
    									cd.idDieta4 = d.idDieta														
    								and DATEDIFF(MONTH,cd.dataCadastro,'01/02/2013') = 0 
    							 GROUP BY cd.idDieta1, cd.idDieta2, cd.idDieta3, cd.idDieta4) as f
    	ON f.idDieta1 = d.idDieta
    	left join ( SELECT cd.idDieta1, cd.idDieta2, cd.idDieta3, cd.idDieta4, count (cd.idControleDieta) as mar		
    							 FROM controleDieta cd, dieta d
    							 WHERE cd.status = 'Ativo' and 
    									cd.idDieta1 = d.idDieta or 
    									cd.idDieta2 = d.idDieta or
    									cd.idDieta3 = d.idDieta or
    									cd.idDieta4 = d.idDieta														
    								and DATEDIFF(MONTH,cd.dataCadastro,'01/03/2013') = 0 
    							 GROUP BY cd.idDieta1, cd.idDieta2, cd.idDieta3, cd.idDieta4) as m
    	ON m.idDieta1 = d.idDieta) AS Q

    Porém existe forma melhor de fazer.
    Vou ver se monto algo aqui e já posto.


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    • Marcado como Resposta Enilton da Bahia segunda-feira, 11 de novembro de 2013 19:35
    sexta-feira, 8 de novembro de 2013 18:39
  • Talvez isso funcione.

    Não tenho certeza pois não testei.

    SELECT idDieta, nome, 'jan', 'fev', 'mar', 'abr', 'mai', 'jun','jul','ago','set','out','nov','dez'
    FROM(
    SELECT d.idDieta, d.nome,
    SUBSTRING(CONVERT(VARCHAR(15),GETDATE()),1,3) as MES, ISNULL(COUNT(cd.*),0) AS TOTAL
    FROM dieta d LEFT JOIN controleDieta cd ON
    (cd.idDieta1 = d.idDieta OR
    cd.idDieta2 = d.idDieta OR
    cd.idDieta3 = d.idDieta OR
    cd.idDieta4 = d.idDieta) AND 
    cd.status = 'Ativo' AND
    YEAR(cd.dataCadastro) = '2013'
    GROUP BY d.idDieta, d.nome, SUBSTRING(CONVERT(VARCHAR(15),GETDATE()),1,3)) AS P
    PIVOT
    (
    SUM(TOTAL)
    FOR idDieta IN (SELECT DISTINCT idDieta FROM dieta)
    ) AS PVT


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    • Marcado como Resposta Enilton da Bahia segunda-feira, 11 de novembro de 2013 19:35
    sexta-feira, 8 de novembro de 2013 19:11
  • Deleted
    • Marcado como Resposta Enilton da Bahia segunda-feira, 11 de novembro de 2013 19:35
    sexta-feira, 8 de novembro de 2013 19:58

Todas as Respostas

  • Deleted
    sexta-feira, 8 de novembro de 2013 18:37
  • Se você pegar a sua consulta e adicionar um group by ele deve retornar corretamente.

    SELECT idDieta, nome, SUM(jan) as jan, SUM(fev) as fev, SUM(mar) as mar FROM (
    SELECT 
    	d.idDieta, d.nome, ISNULL(jan,0) as jan, ISNULL(fev,0) as fev,
                             ISNULL(mar,0) as mar--, ISNULL(CONVERT(varchar(50),abr),0) as abr,
                             --ISNULL(CONVERT(varchar(50),mai),0) as mai, ISNULL(CONVERT(varchar(50),jun),0) as jun, 
                             --ISNULL(CONVERT(varchar(50),jul),0) as jul, ISNULL(CONVERT(varchar(50),aug),0) as aug, 
                             --ISNULL(CONVERT(varchar(50),sep),0) as sep, ISNULL(CONVERT(varchar(50),oct),0) as oct, 
                             --ISNULL(CONVERT(varchar(50),NOV),0) as nov, ISNULL(CONVERT(varchar(50),DEZ),0) as dez, 
                             --ISNULL(CONVERT(varchar(50),total),0) as total
    FROM dieta d 
    	left join ( SELECT cd.idDieta1, cd.idDieta2, cd.idDieta3, cd.idDieta4, count (cd.idControleDieta) as jan		
    						 FROM controleDieta cd, dieta d
    						 WHERE cd.status = 'Ativo' and 
    								cd.idDieta1 = d.idDieta													
    							and DATEDIFF(MONTH,cd.dataCadastro,'01/01/2013') = 0 
    						 GROUP BY cd.idDieta1, cd.idDieta2, cd.idDieta3, cd.idDieta4) as j
    	ON j.idDieta1 = d.idDieta
    	left join ( SELECT cd.idDieta1, cd.idDieta2, cd.idDieta3, cd.idDieta4, count (cd.idControleDieta) as fev		
    							 FROM controleDieta cd, dieta d
    							 WHERE cd.status = 'Ativo' and 
    									cd.idDieta1 = d.idDieta or 
    									cd.idDieta2 = d.idDieta or
    									cd.idDieta3 = d.idDieta or
    									cd.idDieta4 = d.idDieta														
    								and DATEDIFF(MONTH,cd.dataCadastro,'01/02/2013') = 0 
    							 GROUP BY cd.idDieta1, cd.idDieta2, cd.idDieta3, cd.idDieta4) as f
    	ON f.idDieta1 = d.idDieta
    	left join ( SELECT cd.idDieta1, cd.idDieta2, cd.idDieta3, cd.idDieta4, count (cd.idControleDieta) as mar		
    							 FROM controleDieta cd, dieta d
    							 WHERE cd.status = 'Ativo' and 
    									cd.idDieta1 = d.idDieta or 
    									cd.idDieta2 = d.idDieta or
    									cd.idDieta3 = d.idDieta or
    									cd.idDieta4 = d.idDieta														
    								and DATEDIFF(MONTH,cd.dataCadastro,'01/03/2013') = 0 
    							 GROUP BY cd.idDieta1, cd.idDieta2, cd.idDieta3, cd.idDieta4) as m
    	ON m.idDieta1 = d.idDieta) AS Q

    Porém existe forma melhor de fazer.
    Vou ver se monto algo aqui e já posto.


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    • Marcado como Resposta Enilton da Bahia segunda-feira, 11 de novembro de 2013 19:35
    sexta-feira, 8 de novembro de 2013 18:39
  • Sim, eu apenas pedi para gerar um script pelo Management Studio, mas como ele vem muito sujo, e apenas selecionei a parte que contém os campos da tabela. Minha intenção foi apenas mostrar como as tabelas estão dispostas para tornar a visualização mais clara.
    sexta-feira, 8 de novembro de 2013 18:40
  • Talvez isso funcione.

    Não tenho certeza pois não testei.

    SELECT idDieta, nome, 'jan', 'fev', 'mar', 'abr', 'mai', 'jun','jul','ago','set','out','nov','dez'
    FROM(
    SELECT d.idDieta, d.nome,
    SUBSTRING(CONVERT(VARCHAR(15),GETDATE()),1,3) as MES, ISNULL(COUNT(cd.*),0) AS TOTAL
    FROM dieta d LEFT JOIN controleDieta cd ON
    (cd.idDieta1 = d.idDieta OR
    cd.idDieta2 = d.idDieta OR
    cd.idDieta3 = d.idDieta OR
    cd.idDieta4 = d.idDieta) AND 
    cd.status = 'Ativo' AND
    YEAR(cd.dataCadastro) = '2013'
    GROUP BY d.idDieta, d.nome, SUBSTRING(CONVERT(VARCHAR(15),GETDATE()),1,3)) AS P
    PIVOT
    (
    SUM(TOTAL)
    FOR idDieta IN (SELECT DISTINCT idDieta FROM dieta)
    ) AS PVT


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    • Marcado como Resposta Enilton da Bahia segunda-feira, 11 de novembro de 2013 19:35
    sexta-feira, 8 de novembro de 2013 19:11
  • Deleted
    • Marcado como Resposta Enilton da Bahia segunda-feira, 11 de novembro de 2013 19:35
    sexta-feira, 8 de novembro de 2013 19:58