Usuário com melhor resposta
Montar Comando SQL Para Relatório

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.DietaCREATE 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 :
<codeSELECT 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,
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
-
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
-
Deleted
- Marcado como Resposta Enilton da Bahia segunda-feira, 11 de novembro de 2013 19:35
Todas as 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
-
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.
-
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
-
Deleted
- Marcado como Resposta Enilton da Bahia segunda-feira, 11 de novembro de 2013 19:35