2017-10-22 11 views
0

일부 판매 정보를 분석하려고하는데 SQL 쿼리를 작동시킬 수 없습니다. SQL을 올바르게 사용하는 방법을 여전히 배우고 있기 때문에 일반적인 솔루션을 보지 못했을 것입니다.월간 매출을 올리는 올바른 방법

우리 데이터베이스의 모든 기사 목록을 원하고 각각에 대한 월별 판매량을 표시하고 싶습니다. 판매하지 않은 달은 0으로 표시해야합니다.

나는 하나의 테이블에 상품 정보를 저장하고 다른 상품에는 주문 정보를, 실제 상품에는 세 번째 테이블을 저장했다.

내 문제는 이제 어떻게 든 비어있는 것 같아서 필터를 만들 수 없습니다. 또한 다른 표에 날짜를 참조하면 날짜 값이 기존 값/행에 합류하는 대신 "mulitply"(reportMonth에 매월 12 행 남음)입니다.

article_no month(beleg.orderdate) reportMonth VK_amount 
Produkt_A        1    5 
Produkt_A        2    9 
Produkt_A        3    7 
Produkt_A        4    5 
Produkt_A        5    5 
Produkt_A        6    7 
Produkt_A        7    5 
Produkt_A        8    7 
Produkt_A        9    7 
Produkt_A        10    6 
Produkt_A        11    7 
Produkt_A        12    7 
Produkt_A  1       1    1 
Produkt_A  4       4    1 
Produkt_A  5       5    2 
Produkt_A  7       7    3 
Produkt_A  8       8    2 

이 나는 ​​사람이 여기에 도움이 될 아이디어가 있습니까

article_no month(beleg.orderdate) reportMonth VK_amount 
Produkt_A       1   1 
Produkt_A       2   0 
Produkt_A       3   0 
Produkt_A 4      4   1 
Produkt_A 5      5   2 
Produkt_A       6   0 
Produkt_A 7      7   3 
Produkt_A 8      8   2 
Produkt_A       9   0 
Produkt_A 10      10   2 
Produkt_A       11   0 
Produkt_A       12   0 

를 필요가 무엇

//* list of months */ 
WITH dates(reportMonth) as (
    select 1 union all select 2 union all 
    select 3 union all select 4 union all 
    select 5 union all select 6 union all 
    select 7 union all select 8 union all 
    select 9 union all select 10 union all 
    select 11 union all select 12 
    ) 


SELECT article.articleno AS 'article_no' 
    , month(beleg.orderdate) 
    , dates.reportMonth 

    , ISNULL(sum(orders_pos.amount), 0) 
     AS 'VK_amount' 

FROM article 
    CROSS JOIN dates 
    LEFT JOIN orders_pos ON article.articleno = orders_pos.articleno 
    LEFT JOIN orders ON orders_pos.beleg_id = orders.id 
     AND ISNULL(month(orders.orderdate), 0) != 0 
     AND month(orders.orderdate) = dates.reportMonth 

GROUP BY article.artikelnr 
    , month(orders.orderdate) 
    , dates.reportMonth 

이 전류 출력은 다음과 같습니다

내 코드입니다 ? 사례를 이해하는 데 필요한 추가 정보가 필요하면 알려 주시기 바랍니다.

답변

0

GROUP BY의 집계 열이 SELECT의 열과 일치하지 않으므로 쿼리가 작동하지 않아야합니다. 아마도 올바른 쿼리가 도움이 될 것입니다 :

SELECT a.articleno AS article_no, month(o.orderdate), d.reportMonth, 
     COALESCE(sum(op.amount), 0) as VK_amount 
FROM article a CROSS JOIN 
    dates d LEFT JOIN 
    orders_pos op 
    ON a.articleno = op.articleno LEFT JOIN 
    orders o 
    ON op.beleg_id = o.id AND 
     month(o.orderdate) = d.reportMonth -- is there a condition on year? 
GROUP BY a.artikelnr, month(o.orderdate), d.reportMonth 
ORDER BY a.artikelnr, month(o.orderdate), d.reportMonth 
+0

답장을 보내 주셔서 감사합니다. 'GROUP BY'에서이 예제를 함께 사용하는 것은 오타였습니다. 저는 이것을 본문에서 편집했습니다. 이 예제에서는 필요하지 않은 WHERE 문에서 특정 날짜 범위를 선택하기 때문에 연도 조건은 필요하지 않습니다. – Mirakelwhip