2013-09-27 2 views
1

재고가없는 제품 수를 알려주는 쿼리를 작성했습니다. 제조업체가 일부 상태 코드와 함께 반환 한 주문을 보면 알 수 있습니다. 제품, 날짜 및 스토리지, 즉 다음과 같습니다 :이 같은 답변을 생산일부 행으로 그룹화 된 발생 수를 계산합니다.

SELECT count(*) as out_of_stock, 
prod.id as product_id, 
ped.data_envio::date as date, 
opl.id as storage_id 
from sub_produtos_pedidos spp 
left join cad_produtos prod ON spp.ean_produto = prod.cod_ean 
left join sub_pedidos sp ON spp.id_pedido = sp.id 
left join pedidos ped ON sp.id_pedido = ped.id 
left join op_logisticos opl ON sp.id_op_logistico = opl.id 
where spp.motivo = '201' -- this is the code that means 'not in inventory' 
group by storage_id,product_id,date 

: 제품으로, 제품 및 저장에 의해,

out_of_stock | product_id | date  | storage_id 
--------------|------------|-------------|------------- 
1   | 5   | 2012-10-16 | 1 
5   | 4   | 2012-10-16 | 2 

가 지금은 발생 횟수를 얻을 필요를 그 2 일 이상, 5 일 이상 등의 재고가 없어졌습니다.
그래서 첫 번째 쿼리에 대해 새 계산을 수행하고 정의 된 일 간격으로 결과 행을 집계해야한다고 생각합니다.

Postgres (http://www.postgresql.org/docs/7.3/static/functions-datetime.html)의 datetime 함수를 살펴 보았지만 필요한 항목을 찾을 수 없습니다.

+0

테이블 간의 관계에 대해 자세히 알려줘야합니다. 그 1 : 1 관계가 있습니까? 또는 1 : n? 왜 LEFT JOINs인가? 어떤 테이블이 일치하는 행을 가질 수 있습니까? –

답변

0

가입일 :

는 지금은 2 일 이상

그래서

품절되었습니다 제품 및 저장, 제품에 의해, 발생 횟수를 얻을 필요 당신은 결과에있는 각 행 을 개별적으로, 집계 할 수 없다 원한다. 대신 window function을 사용하여 일일 계산을하십시오. 잘 알려진 집계 함수 count()창 집계 함수 역할을 할 수 있습니다 :

SELECT current_date - ped.data_envio::date AS days_out_of_stock 
     ,count(*) OVER (PARTITION BY ped.data_envio::date) AS count_per_days_out_of_stock 
     ,ped.data_envio::date AS date 
     ,p.id     AS product_id 
     ,opl.id    AS storage_id 
FROM sub_produtos_pedidos spp 
LEFT JOIN cad_produtos p ON p.cod_ean = spp.ean_produto 
LEFT JOIN sub_pedidos  sp ON sp.id  = spp.id_pedido 
LEFT JOIN op_logisticos opl ON opl.id = sp.id_op_logistico 
LEFT JOIN pedidos   ped ON ped.id = sp.id_pedido 
WHERE spp.motivo = '201'     -- code for 'not in inventory' 
ORDER BY ped.data_envio::date, p.id, opl.id

정렬 순서 : 제품이 먼저 긴 시간을 재고 있었던 것.
참고, dates을 뺍니다. Postgres에서 integer이됩니다. 당신이 는 "일 이상의 수에 품절되었습니다 n 행"의 의미에서 카운트를 실행, 사용하려는 경우

는 :

count(*) OVER (ORDER BY ped.data_envio::date) -- ascending order! 
             AS running_count_per_days_out_of_stock 

을 동일한 카운트를 얻을 수 같은 날, 친구들이 함께 뭉친다.

1

내가 제대로 질문하지 않았을 수도 있지만 하위 쿼리를 활용해야합니다.

SELECT COUNT(*), date, product_id FROM (YOUR BIG QUERY IS THERE) a 
WHERE a.date < (CURRENT_DATE - interval '2' day) 
GROUP BY date, product_id 
+0

나는 그런 것을 시도했다. 하지만 실제로 필요한 것은 답변을 구별되는 그룹으로 분리하는 것입니다. "2 일 이상 재고가없는 제품", "5 일 이상 재고가없는 제품", "밖으로 나온 제품 저장 시설에 의해 10 일 이상 보관할 수 있습니다. SQL에서이 작업을 수행하는 쉬운 방법이 있는지 알지 못합니다. 보고서를 생성하기 위해 이것을 OLAP 큐브에 넣어야합니다. 아마도 MDX로 ​​큐브를 쿼리하는 것이 더 쉽습니다 ... – Pedro