Asked Jun 5th, 8:51 a.m. 162 0 2
  • 162 0 2
+2

Vòng lặp với biến động trong câu lệnh SELECT

Share
  • 162 0 2

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

image.png 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 ANSWERS


Answered Friday, 1:55 a.m.
0

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;
Share
Answered Jun 10th, 3:14 a.m.
-2

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
Share
Viblo
Let's register a Viblo Account to get more interesting posts.