Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Ola. Tenho uma tabela com a seguinte estrutura:
DATA PRODUTO QTE_VENDIDA
13/05/2018 12345 100
14/05/2018 12345 100
15/05/2018 12345 200
16/05/2018 12345 50
17/05/2018 12345 30
18/05/2018 12345 20
19/05/2018 12345 100
Gostaria de fazer um select que me agrupasse por semana dentro do periodo, algo como:
SEMANA INICIO SEMANA FIM PRODUTO QTDE VENDIDA
13/05/2018 19/05/2018 12345 600
20/05/2018 26/05/2018 12345 300
Alguém sabe me dizer como posso montar assim?
ObrigadoObrigado Motta pela dica.
Apenas não consegui montar a estrutura para chegar nesse modelo, tipo eu colocar um range de datas e dentro desse range ele montar essa quebra de semana com seus subtotais.
Você poderia me dar uma forma com um modelo a seguir?
Obrigado
Um exemplo com a view USER_OBJECTS , a solução atende , até guardei nos meus alfarrábios pois pode vir a ser útil.
SELECT TO_CHAR(CREATED,'WW') "NUMERO DA SEMANA",
TO_CHAR(TRUNC(CREATED, 'IW')-1,'DD-MON-YYYY') "DIA INICIAL SEMANA",
TO_CHAR(NEXT_DAY(TRUNC(CREATED,'IW'),'SATURDAY'),'DD-MON-YYYY') "DIA FINAL DA SEMANA" ,
COUNT(*) QTD
FROM USER_OBJECTS
WHERE CREATED >= TO_DATE('01/01/2018','DD/MM/YYYY')
GROUP BY TO_CHAR(CREATED,'WW') ,
TO_CHAR(TRUNC(CREATED, 'IW')-1,'DD-MON-YYYY') ,
TO_CHAR(NEXT_DAY(TRUNC(CREATED,'IW'),'SATURDAY'),'DD-MON-YYYY')
ORDER BY 1Muito Obrigado Motta, era exatamente isso. resolveu meu problema.
Apenas fiz algumas alterações de tipo de campo para melhorar o ordenação e ficou assim:
SELECT TO_NUMBER(TO_CHAR(CREATED,'WW')) "NUMERO DA SEMANA",
TO_DATE(TO_CHAR(TRUNC(CREATED, 'IW')-1,'DD/MM/YYYY')) "DIA INICIAL SEMANA",
TO_DATE(TO_CHAR(NEXT_DAY(TRUNC(CREATED,'IW'),'SÁBADO'),'DD/MM/YYYY')) "DIA FINAL DA SEMANA" ,
COUNT(*) QTD
FROM USER_OBJECTS
WHERE CREATED >= TO_DATE('01/01/2018','DD/MM/YYYY')
GROUP BY TO_CHAR(CREATED,'WW') ,
TO_CHAR(TRUNC(CREATED, 'IW')-1,'DD/MM/YYYY') ,
TO_CHAR(NEXT_DAY(TRUNC(CREATED,'IW'),'SÁBADO'),'DD/MM/YYYY')
ORDER BY 2 desc
Mais uma vez, muito obrigado.
Boa Tarde Motta será que você poderia me dar uma força?
Montei o SQL conforme postei acima, até ai blz. O problema é que nele não esta aparecendo a semana do dia 15/07/2018 a 21/07/2018 que seria a semana 29 já pula para a semana 30.
Alguma ideia de porque isso possa estar ocorrendo?
Obrigado
Não existem ocorrências nestas datas
Pior que tem. Existem movimento na tabela de vendas.
Outra coisa em tese essa base não é apenas para montar uma lista com as semanas independente de movimentação?
Tenho casos que que realmente não houve movimentação do produto nessa semana porem a semana aparece normal.
O que estou procurando entender por que pula essa semana.
Veja se isto ajuda.
Obrigado Motta, mas nesse caso não pois o que preciso são as datas de inicio e fim de cada semana.
O exemplo que você montou para mim ficou bacana só não consegui entender porque somente nessa semana o fluxo quebra as outra carrega certinho.
O exemplo citado do SO tem a vantagem de gerar datas sem precisar de uma tabela.
Sim é ótimo o exemplo para outras situações. Não monta como eu preciso. O que preciso é exatamente como você me passou: mostrar o dia de inicio e fim da cada semana.
faça
CREATE OR REPLACE VIEW V_SEMANAS_ANO AS
SELECT
to_char(CAL.DATA,'yyyy') ano,
CAL.DATA,
TO_NUMBER(TO_CHAR(CAL.DATA,'WW')) "NUMERO DA SEMANA",
TO_DATE(TO_CHAR(TRUNC(CAL.DATA, 'IW')-1,'DD/MM/YYYY')) "DIA INICIAL SEMANA",
TO_DATE(TO_CHAR(NEXT_DAY(TRUNC(CAL.DATA,'IW'),'saturday'),'DD/MM/YYYY')) "DIA FINAL DA SEMANA"--ou sabado SELECT
(
TO_DATE(SEQ.MM || SEQ.YYYY, 'MM/YYYY')-1
-- Subtrai 1 por SEQ.NUM não começar em zero
) + SEQ.NUM AS "DATA"
FROM
(
SELECT RESULT NUM,
TO_CHAR(( -- Data Mínima
TO_DATE('01/01/2018', 'DD/MM/YYYY')
) , 'MM') AS "MM",
TO_CHAR(( -- Data Mínima
TO_DATE('01/01/2018', 'DD/MM/YYYY')
) , 'YYYY') AS "YYYY"
FROM
(
SELECT ROWNUM RESULT FROM DUAL CONNECT BY LEVEL <= (
(
-- Data Máxima
LAST_DAY(TO_DATE('31/12/2050', 'DD/MM/YYYY'))
-
-- Data Mínima
TRUNC(TO_DATE('01/01/2018', 'DD/MM/YYYY')) -- Sempre primeiro dia do mês
) + 1 -- Último dia do último ano
)
) -- Quantas sequências para gerar pelo MAX
) SEQSELECT * FROM V_SEMANAS_ANO
where ano = '2018'
SELECT * FROM V_SEMANAS_ANO
where data = trunc(sysdate)
ANO DATA NUMERO DA SEMANA DIA INICIAL SEMANA DIA FINAL DA SEMANA
---- -------- ---------------- ------------------ -------------------
2018 31/08/18 35 26/08/18 01/09/18
Acho que resolve até 31/12/2050
http://www.dba-oracle.com/t_display_start_end_date_for_week.htm
https://asktom.oracle.com/pls/asktom/f?p=100:11:::NO:RP:P11_QUESTION_ID:9537706000346464327
https://www.techonthenet.com/oracle/functions/to_char.php
W , WW e IW permitem saber a semana , os exemplos ajudam creio.