簡體   English   中英

查詢動態列表時 GROUP_CONCAT 中的 COUNT 不起作用

[英]COUNT in GROUP_CONCAT not working while querying a dynamic column table

我有一個名為table1的表,如下所示:

   id    period         value       name
   1     2020-06-01     3           anna
   2     2020-06-01     2           anna
   3     2020-06-01     3           anna
   4     2020-06-01     1           juned
   5     2020-06-01     3           juned
   6     2020-06-01     2           juned
   7     2020-07-01     3           anna
   8     2020-07-01     2           anna
   9     2020-07-01     2           anna
  10     2020-07-01     3           juned
  11     2020-07-01     3           juned
  12     2020-07-01     3           juned

我希望查詢的結果顯示值3的計數

name      2020-06-01     2020-07-01
anna          2              2
juned         1              3

我試過這是代碼,但它導致錯誤#1111 - invalid use of group function

SET @sql = NULL;
SELECT
    GROUP_CONCAT(DISTINCT
        CONCAT(
            'MAX(IF (table1.period = "',
            table1.period, '", COUNT(CASE WHEN value = 3 THEN 1 END), 0)) AS `',
            table1.period, '`'
        )
    ) INTO @sql
FROM table1;
SET @sql =  CONCAT(
                'SELECT name, ',
                @sql,
                ' FROM table1 GROUP BY name'
            ); 
PREPARE stmt FROM @sql;
EXECUTE stmt;

我會將動態 SQL 編寫為:

SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT 'SUM(value = 3 AND period = ''', period, ''') AS `', period, '`')
INTO @sql
FROM table1;

SET @sql =  CONCAT('SELECT name, ', @sql, ' FROM table1 GROUP BY name'); 
          
-- debug
select @sql;

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

您的代碼的主要問題是您在聚合函數中表述條件表達式的方式。 還:

  • GROUP_CONCAT()不需要CONCAT() :您可以在GROUP_CONCAT()放置多個值,用字符串分隔

  • 對文字字符串使用單引號而不是雙引號

  • 執行查詢后, DEALLOCATE語句處理程序

DB Fiddle 上的演示- 首先感謝會見 Soni 以創建小提琴。

生成的sql:

| @sql                                                                                                                                                     |
| :------------------------------------------------------------------------------------------------------------------------------------------------------- |
| SELECT name, SUM(value = 3 AND period = '2020-06-01') AS `2020-06-01`,SUM(value = 3 AND period = '2020-07-01') AS `2020-07-01` FROM table1 GROUP BY name |

查詢結果:

name  | 2020-06-01 | 2020-07-01
:---- | ---------: | ---------:
anna  |          2 |          1
juned |          1 |          3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM