Vòng lặp với biến động trong câu lệnh SELECT
Cho em hỏi: Thay vì viết nhiều lần các biểu thức SUM(CASE WHEN ...) cho mỗi giá trị có thể của bbtng_gr, có cách nào khác như vòng lặp và thay 'Both' bằng biến động không
SELECT SUM(CASE WHEN bpcs.bbtng_gr = 'Both' THEN 1 ELSE 0 END) AS [Both], SUM(CASE WHEN bpcs.bbtng_gr = 'OPEN' THEN 1 ELSE 0 END) AS [OPEN], SUM(CASE WHEN bpcs.bbtng_gr = 'C' THEN 1 ELSE 0 END) AS [C], SUM(CASE WHEN bpcs.bbtng_gr = 'Short' THEN 1 ELSE 0 END) AS [Short], SUM(CASE WHEN bpcs.bbtng_gr = 'SPK' THEN 1 ELSE 0 END) AS [SPK], SUM(CASE WHEN bpcs.bbtng_gr = '4W' THEN 1 ELSE 0 END) AS [4W], SUM(CASE WHEN bpcs.bbtng_gr = 'AUX' THEN 1 ELSE 0 END) AS [AUX], SUM(CASE WHEN bpcs.bbtng_gr = 'ER' THEN 1 ELSE 0 END) AS [ER] FROM
2 CÂU TRẢ LỜI
Bạn có thể áp dụng câu SQL động sau :
-- xử lý chuỗi
SET SESSION group_concat_max_len = 100000000;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'SUM(COALESCE((CASE WHEN bbtng_gr = ''' ,
bbtng_gr ,
''' THEN 1 END), 0)) AS `' ,
TRIM(bbtng_gr) , '`'
) ORDER BY sort
)
INTO @sql
FROM tmpTableA;
-- execute câu sql động
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Bạn có thể sử dụng group by và select count. Mỗi loại bpcs.bbtng_gr sẽ trả về 1 row chứa thông tin: bpcd.bbtng_gr, số lượng Example:
SELECT bpcd.bbtng_gr, COUNT(*)
FROM bpcd
WHERE bpcd.bbtng_gr IN ('Both', 'OPEN', ....)
GROUP BY bpcd.bbtng_gr