문제 :
따라서 다음과 같은 두 개의 테이블이 있습니다 :
main_table: property_table:
+----------------------------+ +-------------------------+
| event| property_id | value | | property_id | name |
+----------------------------+ +-------------------------+
| 1 | 1 | 100 | | 1 | property1 |
| 2 | 1 | 200 | | 2 | property2 |
| 3 | 2 | 50 | | 3 | property3 |
| 4 | 3 | 10 | +-------------+-----------+
| 5 | 3 | 30 |
그리고 다음 쿼리를 사용합니다 :
SELECT pt.name, SUM(value) as subtotal
FROM main_table as mt
LEFT JOIN property_table as pt
ON mt.property_id = pt.property_id
GROUP BY pt.name;
다음 표를 얻습니다 :
+-------------------------+
| name | subtotal |
---------------------------
| property1 | 300 |
| property2 | 50 |
| property3 | 40 |
이제이 표에 행을 추가하여 모든 속성 중 총계를 계산하려고합니다.그러나 여기에는 캐치가 있으며 일부 속성을 추가하고 일부를 빼야합니다. 따라서 논쟁을 위해total = property1-property2 + property3이라고 가정하겠습니다.
예상 출력 :
+-------------------------+
| name | subtotal |
---------------------------
| property1 | 300 |
| property2 | 50 |
| property3 | 40 |
| total | 290 |
참고 사항 :
이제 "GROUP BY"는 "WITH ROLLUP"과 함께 사용할 수 있지만 모든 값을 독점적으로 추가합니다. 기술적으로 테이블에 음수를 허용하고 "WITH ROLLUP"으로 모든 것을 해결할 수는 있지만 사용자 오류가 발생하기 쉬운 것 같습니다. 음의 정수를 피하기 위해 상단에 있습니까?
-
답변 # 1
-
답변 # 2
결국 GROUP BY WITH ROLLUP을 사용할 때 SUM 내부에서 사례를 구현할 수 있음을 발견했습니다.
SELECT pt.name, SUM( CASE WHEN pt.name = 'property2' THEN -mt.value ELSE mt.value END ) as subtotal FROM main_table as mt LEFT JOIN property_table as pt ON mt.property_id = pt.property_id GROUP BY pt.name WITH ROLLUP;
그러나 실제 구현은 action이라는 열을 추가하기로 결정했습니다.
property_table: +-------------------------+---------+ | property_id | name | action | +-------------------------+---------+ | 1 | property1 | '+' | | 2 | property2 | '-' | | 3 | property3 | '+' | +-------------+-----------+---------+
Case를 IF로 교체하십시오 :
SELECT pt.name, SUM(IF(pt.action='-', -mt.value, mt.value) as subtotal FROM main_table as mt LEFT JOIN property_table as pt ON mt.property_id = pt.property_id GROUP BY pt.name WITH ROLLUP;
관련 자료
- sql - mysql 8 피벗 쿼리는 null이 아닌 값을 반환해야합니다
- ManyToMany 필드의 총 레코드 수에 대한 Django 쿼리
- MYSQL 선택 쿼리에서 'INT'유형 데이터에 대해 int 값만 전달해야합니까?
- MySQL 중첩 SELECT 쿼리를 실행하는 데 시간이 너무 오래 걸림
- 한 줄에/수평으로 MySQL 쿼리 출력 표시
- 사용자가 PHP를 클릭 할 때 특정 시간 동안 MySQL 함수를 사용하여 MySQL 쿼리를 실행하려고합니다
- MySQL - mysql - 이 느린 실행 쿼리가 올바른 인덱스를 사용하지 않는 이유는 무엇입니까?
- javascript - 검색 매개 변수를 기반으로 데이터베이스를 쿼리하고 각 위치에 대해 '전체'를 반환
- 조인을 사용하지 않고 MySQL 조인 쿼리를 최적화하는 방법
- sql - 조인 된 여러 테이블로 MySQL 쿼리 정렬
- database - MySQL 날짜 비교 쿼리
- 제한의 큰 영향을받는 MySQL 쿼리 시간
- MYSQL 쿼리에서 UPDATE 내에서 선택하는 방법
- sql - MySQL 선택 쿼리는 여러 ID를 포함하는 행을 가져옵니다
- database - MySQL 케이스 조인 쿼리 지원
- performance - 최대 15 개의 피연산자를 처리하는 더하기 또는 빼기 계산기
- 테스트/답변에 대해 일치하는 레코드 및 백분율을 결정하는 MySQL 단일 쿼리
- mysql - 기본적으로 어떤 주문을 쿼리하고 순위를 매 깁니다 (항목 고정/보류?)
- Laravel-MySQL 쿼리 연결 타이밍 로깅
- php - MySQL 쿼리에서 처리되고 일치하지 않는 모든 와우를 반환하십시오
모든 조합을 기반으로 하위 쿼리를 사용할 수 있습니다 하나는 값을 선택하고 하나는 전체를 선택합니다