Я играю с некоторым кодом из статьи, написанной Питером Броули , найденной здесь на странице 6 pdf. Я пытаюсь выяснить, как это автоматизировать, чтобы результат процедуры автоматически помещался в запрос выбора. Прямо сейчас я вызываю процедуру, экспортирую результат в текстовый файл, перехожу к текстовому файлу вручную (щелкаю мышью), копирую результат и вставляю его в оператор выбора. Я не смог выяснить, как вставить оператор select в процедуру или поместить процедуру в таблицу в моей базе данных или в переменную, которую я могу вызвать из оператора select. Есть идеи?
Вот пример кода от Питера Броули, который я пытался автоматизировать:
use database;
DROP PROCEDURE IF EXISTS writesumpivot;
DELIMITER |
CREATE PROCEDURE writesumpivot(
db CHAR(64), tbl CHAR(64), pivotcol CHAR(64), sumcol CHAR(64)
)
BEGIN
DECLARE datadelim CHAR(1) DEFAULT '"';
DECLARE comma CHAR(1) DEFAULT ',';
DECLARE singlequote CHAR(1) DEFAULT CHAR(39);
SET @sqlmode = (SELECT @@sql_mode);
SET @@sql_mode='';
SET @pivotstr = CONCAT( 'SELECT DISTINCT CONCAT(', singlequote,
',SUM(IF(', pivotcol, ' = ', datadelim, singlequote,
comma, pivotcol, comma, singlequote, datadelim,
comma, sumcol, ',0)) AS `',
singlequote, comma, pivotcol, comma, singlequote, '`',
singlequote, ') AS sumpivotarg FROM ', db, '.', tbl,
' WHERE ', pivotcol, ' IS NOT NULL' );
-- UNCOMMENT TO SEE THET MIDLEVEL SQL:
-- SELECT @pivotstr;
PREPARE stmt FROM @pivotstr;
EXECUTE stmt;
drop prepare stmt;
SET @@sql_mode=@sqlmode;
END
|
DELIMITER ;
call writesumpivot('database', 'table', 'pivotcol','sumcol');
Тогда оператор Select выглядит следующим образом:
SELECT
infoField
[results of the call]
FROM
database.table
GROUP BY infoField;
Если предположить, что я выполнил вызов, экспортировал результаты, скопировал их и вставил их в оператор выбора, мои личные результаты вызова в запросе SELECT будут выглядеть примерно так:
SELECT
infoField
,SUM(IF(pivotcol = "Yellow",sumcol,0)) AS `Yellow`
,SUM(IF(pivotcol = "Red",sumcol,0)) AS `Red`
,SUM(IF(pivotcol = "Purple",sumcol,0)) AS `Purple`
,SUM(IF(pivotcol = "Orange",sumcol,0)) AS `Orange`
,SUM(IF(pivotcol = "Green",sumcol,0)) AS `Green`
,SUM(IF(pivotcol = "Blue",sumcol,0)) AS `Blue`
,SUM(IF(pivotcol = "White",sumcol,0)) AS `White`
FROM database.table
GROUP BY infoField;
Запуск приведенного выше оператора select дает мне нужную сводную таблицу. Я пытаюсь выяснить, как включить это в веб-сайт, поэтому его нужно автоматизировать.
Я попытался вставить таблицу создания, а затем сослаться на таблицу, но не получил желаемых результатов.
Отредактировал последний раздел ПРОЦЕДУРЫ следующим образом:
--SELECT @pivotstr;
DROP TABLE IF EXISTS temp2;
CREATE TABLE IF NOT EXISTS temp2(sumpivotarg varchar(8000));
PREPARE stmt FROM @pivotstr;
...
изменил вызов и выберите следующее:
call writesumpivot('database','table','pivotcol','sumcol');
insert into temp2(sumpivotarg) values(@pivotstr);
SELECT
table.infoField, temp2.sumpivotarg
FROM table, temp2
GROUP BY infoField
Результатом этого стал общий код, а не суммирование содержимого ячеек в базе данных. это выглядит примерно так:
infoField | sumpivotarg <- Col Заголовки </p>
123 | SELECT DISTINCT CONCAT ('Sum (if (pivotcol = ", pivotcol", sumcol, 0)) AS 'pivotcol,'
') ..
124 | SELECT DISTINCT CONCAT ('Sum (if (pivotcol = ", pivotcol", sumcol, 0)) AS 'pivotcol,'
') ..
125 | выберите DISTINCT CONCAT ('Sum (if (pivotcol = ", pivotcol", sumcol, 0)) AS 'pivotcol,'
') ..