>

다음과 같이 설정 한 테스트 데이터베이스가 있습니다 :

CREATE TABLE summary (
   row_sid SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
   product_list_sid INT,
   amount INT,
   qty INT
);
CREATE TABLE list_header (
   product_list_sid INT
);
CREATE TABLE list_detail (
   product_list_sid INT,
   product_sid INT
);
CREATE TABLE product (
   product_sid SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
   product_description VARCHAR(60)
);
INSERT INTO product(product_description) VALUES ("can"), ("bottle");
INSERT INTO list_detail VALUES (1,1), (1,1), (1,2), (2,1), (2,2),(2,2),(2,1);
INSERT INTO list_header VALUES (1), (2);
INSERT INTO summary(product_list_sid, amount, qty) VALUES (1,3,9), (1,15,45), (2,12,36);

요약에서 '수량'및 '수량'값과 함께 요약 된 테이블에 포함 된 모든 제품의 분해 된 목록을 얻을 수있는 방식으로 모든 테이블을 조인하는 쿼리를 작성했습니다. 지금까지 잘하고 있습니다 ...

문의 :

SELECT row_sid, product_description, amount, qty
FROM summary
INNER JOIN list_header ON summary.product_list_sid = list_header.product_list_sid
INNER JOIN list_detail ON list_header.product_list_sid = list_detail.product_list_sid
INNER JOIN product ON list_detail.product_sid = product.product_sid;

결과 :

row_sid     product_description     amount  qty
1           can                     3       9
2           can                     15      45
1           can                     3       9
2           can                     15      45
1           bottle                  3       9
2           bottle                  15      45
3           can                     12      36
3           bottle                  12      36
3           bottle                  12      36
3           can                     12      36

이제 'amount'및 'qty'값을 동일한 row_sid를 공유하는 행 수로 나누도록 해당 쿼리를 수정하고 싶습니다.

따라서이 샘플에서 row_sid가 "1"또는 "2"인 모든 행의 1/3은 'amount'및 'qty'값의 1/3이고 row_sid가 "3"인 모든 행의 1/4은 '금액'및 '수량'값

이렇게하면 이론적으로 다음 표가 나타납니다.

row_sid     product_description     amount  qty
1           can                     1       3
2           can                     5       15
1           can                     1       3
2           can                     5       15
1           bottle                  1       3
2           bottle                  5       15
3           can                     3       9
3           bottle                  3       9
3           bottle                  3       9
3           can                     3       9

이것까지 도달했습니다 :

SELECT row_sid, product_description, amount / COUNT(row_sid) AS amount, qty / count(row_sid) AS qty
FROM summary
INNER JOIN list_header ON summary.product_list_sid = list_header.product_list_sid
INNER JOIN list_detail ON list_header.product_list_sid = list_detail.product_list_sid
INNER JOIN product ON list_detail.product_sid = product.product_sid
GROUP BY row_sid;

수율 :

row_sid     product_description     amount  qty
1           can                     1       3
2           can                     5       15
3           can                     3       9

이것은 계산을 올바르게하지만 GROUP BY는 필요한 다른 모든 행을 잘라냅니다. 그러나 GROUP BY가 없으면 목표에서 더 멀어집니다.

내가 무엇을 놓치고 있습니까?

  • 답변 # 1

    같은 쿼리의 그룹 결과에 대한 쿼리와 카운트 사이에 조인이 필요한 것 같습니다.

    그룹별로 쿼리 만 사용하는 경우 그룹별로 "데이터를 그룹화"하기 때문에 모든 행을 가지고 있지 않으므로 그룹 별이 동작을 피하기 위해 원래 쿼리와 집계 된 쿼리를 결합 할 수 있습니다. 예 :

    SELECT s.row_sid, product_description, amount/t.my_count, qty/t.my_count
    FROM summary s
    INNER JOIN list_header ON summary.product_list_sid = list_header.product_list_sid
    INNER JOIN list_detail ON list_header.product_list_sid = list_detail.product_list_sid
    INNER JOIN product ON list_detail.product_sid = product.product_sid
    INNER JOIN (
      SELECT row_sid, COUNT(row_sid)  my_count
      FROM summary
      INNER JOIN list_header ON summary.product_list_sid = list_header.product_list_sid
      INNER JOIN list_detail ON list_header.product_list_sid = list_detail.product_list_sid
      INNER JOIN product ON list_detail.product_sid = product.product_sid
      GROUP BY row_sid;
    ) t on t.row_sid = s.row_sid
    
    

  • 이전 python - 효율적으로 팬더 DataFrame에 행 추가
  • 다음 loops - 평균값 스칼라 증가