3 개의 컬럼이 포함 된 테이블이 있습니다. Location_ID, Product_ID 및 Qty :
LOCATION_ID | PRODUCT_ID | QTY
--------------------------------
1 1 1
2 1 3
1 3 5
2 3 2
2 4 2
1 4 5
제품이 위치를 출입 할 때마다이 테이블에서 행이 생성되거나 업데이트됩니다.
테이블에있는 Location_ID 수에 따라 열을 추가하는 쿼리를 만들 수 있습니까?
결과가 다음과 같기를 바랍니다.
PRODUCT_ID | 1 | 2 |
--------------------
1 1 3
3 5 2
4 5 2
나중에 LOCATION_ID가 더 추가되면 쿼리에 위치 ID (3)라는 이름의 새 열이 있습니다.
이를 위해 동적 SQL을 사용해야합니다.
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT
CONCAT('SUM(CASE WHEN location_id = ', location_id,
' THEN qty END) `', location_id, '`'))
INTO @sql
FROM table1;
SET @sql = CONCAT('SELECT product_id, ', @sql, '
FROM table1
GROUP BY product_id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
산출:
| PRODUCT_ID | 1 | 2 | | ------------ | --- | --- | | 1 | 1 | 3 | | 3 | 5 | 2 | | 4 | 5 | 2 |
다음은 SQLFiddle 데모입니다.
클라이언트 쪽에서 작업을 단순화하기 위해 항상 저장 프로 시저로 래핑 할 수 있습니다.
DELIMITER $$
CREATE PROCEDURE products_by_location()
BEGIN
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT
CONCAT('SUM(CASE WHEN location_id = ', location_id,
' THEN qty END) `', location_id, '`'))
INTO @sql
FROM table1;
SET @sql = CONCAT('SELECT product_id, ', @sql, '
FROM table1
GROUP BY product_id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;
그리고 그것을 사용하십시오
CALL products_by_location();
다음은 SQLFiddle 데모입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다