Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Senhores, boa noite.
Estou com a seguinte dúvida...tenho uma tabela de excel com as seguintes informações..
Hóspede: Paulo Cruz, DataEntrada: 21/11/2010, Saída: 25/11/2010.
Logo, queria um gráfico em linha que mostrasse que tenho 1 hospede dia 21, 22, 23, 24 e 25.
Exatamente como no Exemplo abaixo feito em Excel.
Obrigado desde já,
Fabio Alamini
Fabio,
Esse é um típico problema que na primeira olhada parece ser bem simples, mas na verdade não é.
Fiquei curioso com o problema, e resolvi simular por aqui.
Consegui resolver, com algumas etapas, usando tabela temporária.
Segue o script abaixo:
------------------------------------------------------------------------------------------------------------
Clientes:
LOAD Item,
Cliente,
Data_Entrada,
Data_Saida
FROM
[teste-datas.xls]
(biff, embedded labels, table is Plan1$);
Datas:
load
distinct Data_Entrada as Data
resident
Clientes;
Datas:
load
distinct Data_Saida as Data
resident
Clientes;
Agenda_Temp:
noconcatenate Load
Data
resident
Datas;
left join
load * resident Clientes;
Drop table Clientes;
Agenda:
Load
Data,
if (Data_Entrada <= Data and Data_Saida >=Data, 1,0) as Hospedes
resident Agenda_Temp;
Drop Table Agenda_Temp;
------------------------------------------------------------------------------------------------
Foi um bom exercicio. Vai ser util para mim, tambem. Provavelmente deve ser possivel otimizar o codigo, para nao utilizar essas tabelas temporarias.
Use um gráfico com a dimensao: Data e a expressao: sum(Hospedes)
Se precisar, posso mandar o qvw (já na versao qlikview 10) do projeto para voce.
Fábio,
O exemplo do Ricardo é melhor do que eu lhe mandei.
Só tem o caso das datas intermediárias que ainda não existirão, caso precise delas precisará gerar o calendário como no exemplo que lhe enviei.
Bem observado, Fabio Simoes
Para as datas nao existentes (Data de Entrada ou Data de Saidas) nao apareceriam no grafico.
Será realmente necessário nesse caso utilizar um calendario, que contem todas as datas.
e ai Fábio?
não vi o seu exemplo, mas parece um caso clássico de Intervalmatch com uma tabela calendar master entre a menor e a maior data possível.
Abraços
Senhores..
Com isto que o Tonial me passou funcionou redondinho..
Obrigado pela ajuda...
DadosHist:
LOAD * INLINE [
Hospede, Entrada, Saída
Hospede 1, 20/11/2010, 25/11/2010
Hospede 2, 23/11/2010, 30/11/2010
];
Calendario:
LOAD
Date(MonthStart(Today())+(RowNo()-1)) AS Data
Autogenerate(30);
//exit script;
DadosHist:
LEFT JOIN (DadosHist)
IntervalMatch (Data) LOAD Entrada, Saída RESIDENT DadosHist;
Dados:
LEFT JOIN (Calendario) LOAD DISTINCT Data, Hospede RESIDENT DadosHist;
DROP TABLE DadosHist;
Olá pessoal,
Estou tentando adaptar esse script para uma situação que tenho. Preciso acompanhar o histórico do saldo de estoque, relatando a evolução, mas na base de dados só temos informação de saldo quando existe movimentação. Entretanto o saldo se mantém mesmo sem movimentação. Tentei fazer isso usando o intervalmatch e um calendário e a vaca foi pro brejo pois o volume de registro ultrapassou os 800 milhões de registros. Estou encaminhano abaixo meu script pois já não sei mais o q fazer e nem pra qual santo rezar!!!
Abraços e obrigado
SALDO_TEMP:
LOAD ID_EMPRESA,
ID_ALMOXARIFADO,
ID_PRODUTO,
DT_HISTORICO_SALDO AS DT_INICIAL,
QT_HISTORICO_SALDO,
VL_MEDIO
FROM [..\QVD\HIST_SALDO.QVD] (qvd)
WHERE DT_HISTORICO_SALDO >= date('01/01/2012');
//FAÇO ISSO PARA IDENTIFICAR ATÉ QUANDO O ESTOQUE SE MANTEVE INALTERADO
SALDO:
LOAD *, IF( ID_EMPRESA = Previous(ID_EMPRESA) AND ID_ALMOXARIFADO = Previous(ID_ALMOXARIFADO) and ID_PRODUTO = Previous(ID_PRODUTO), date(Previous(DT_INICIAL)-1), Today() ) AS DT_FINAL
RESIDENT SALDO_TEMP
ORDER BY
ID_EMPRESA DESC,
ID_ALMOXARIFADO DESC,
ID_PRODUTO DESC,
DT_INICIAL DESC;
DROP TABLE SALDO_TEMP;
//MONTO UM CALENDÁRIO COM TODAS AS DATAS ATÉ A DATA ATUAL
MinMaxTab:
LOAD Min([DT_INICIAL]) as MinTaskStart
RESIDENT SALDO GROUP BY 1;
Let varMinDate = peek('MinTaskStart');
Let varMaxDate = TODAY();
drop table MinMaxTab;
LET VMinOrderDate = date($(varMinDate));
Calendario:
Load date('$(VMinOrderDate)' + Recno() - 1) as Data
AutoGenerate (varMaxDate - varMinDate + 1);
//AQUI ENTRA O INTERVALMATCH PARA PREENCHER TODAS AS DATA DO INTERVALO
//exit script;
SALDO:
LEFT JOIN (SALDO)
IntervalMatch (Data)
LOAD DT_INICIAL, DT_FINAL
RESIDENT SALDO;