sql >> Database teknologi >  >> RDS >> Mysql

MySQL eller PHP Omdan rækker til kolonner

Hvis du også vil have separate kolonner for dine årstal, skal du tilføje året (beregnet ud fra din kolonne date ) til din dynamiske sql-kode:

CREATE DEFINER=`root`@`localhost` PROCEDURE `test`()
BEGIN
  SET group_concat_max_len=2048;
  SET @sql = NULL;

  SELECT GROUP_CONCAT(DISTINCT CONCAT(
      'MAX(IF(month = ''',
      month,
      ''' and year(date) = ',
      year(date),
      ', amount, NULL)) AS `',
      month,
      '_',
      year(date),
      '`'
    )
    order by date
  ) INTO @sql
  FROM tmp_results;

  if coalesce(@sql,'') != '' then
    set @sql = concat(', ', @sql);
  end if; 

  SET @sql = CONCAT(
    'SELECT r.account, 
     r.region ',  
     coalesce(@sql,''),
    ' FROM tmp_results r
     LEFT JOIN accounts AS a
     on r.account_id = a.id
     GROUP BY r.account, r.region');

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

Kolonnerne vil blive navngivet som January_2017 , og jeg tilføjede en order by date , ellers ville de normalt være uordnede.

Jeg tilføjede en group by r.region , ellers vil det ikke fungere, hvis only_full_group_by er aktiveret på din server (som er standardværdien, der starter med MySQL 5.7).

Og jeg tilføjede en test for tomme tabeller (som ellers ville resultere i en fejl). Hvis du ikke har brug for det og kun kopierer dele af min kode til din, skal du være opmærksom på det manglende komma efter r.region i SET @sql = CONCAT('SELECT r.account, r.region ' sammenlignet med din kode, skal du muligvis tilføje den igen.

Da koden for hver måned har en længde på omkring 80, skal du muligvis øge group_concat_max_len for at passe til din størst mulige forespørgsel.




  1. Hvad er nogle gode, hurtige vedvarende lagringsmuligheder for nøgle->værdidata?

  2. Hvordan kontrollerer man, om en streng er en unik identifikator?

  3. Brugervariabel i MySQL underforespørgsel

  4. Infinite Scroll Indlæser alle elementer på én gang?