2013-04-04 2 views
0

просто играл с некоторыми SQL заявления на сервер MySQL 5.1 я уже задавала вопрос, как сделать определенное количество на двух столах (см here) и я нашел ответ, как перенести мой результат (см. here), но я не могу использовать его на моем локальном сервере MYSQL 5.1.Использование @DECLARE в MYSQL 5,1

Это таблица один: тест

id|name|test_type 
------------- 
1|FirstUnit|1 
2|FirstWeb|2 
3|SecondUnit|1 

Вторая таблица: test_type

id|type 
-------- 
1|UnitTest 
2|WebTest 

Следующий результат будет записан в "yourtable" (временную таблицу)

type|amount 
----------- 
UnitTest|2 
WebTest|1 

Что я хочу иметь в конце:

UnitTest|WebTest 
----------------- 
2|1 

(Проблема в том, как мне кажется, последняя часть из MS-SQL, например, поэтому он не будет работать на MYSQL)

Это мои операторы SQL:

--create a temporary table 
create temporary table IF NOT EXISTS yourtable 
(
test_type varchar(255), 
amount varchar(255) 
); 

--make a selecten into the temporary table 
INSERT INTO yourtable 
SELECT 
    t.test_type , 
    COUNT(*) AS amount 

FROM test_types AS t 
    JOIN test AS te ON t.id= te.test_type 
GROUP BY test_type 
ORDER BY t.test_type; 


--just for debugging 
select * from yourtable; 


-- transpose result 
DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Type) 
        from yourtable 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT ' + @cols + ' from 
      (
       select Type, Amount, 
        row_number() over(partition by Type order by Type, Amount) rn 
       from yourtable 
      ) x 
      pivot 
      (
       max(Amount) 
       for Type in (' + @cols + ') 
      ) p ' 

execute(@query) 

--drop temporary table 
drop table yourtable; 

I не может запустить последнюю часть, где я хочу перенести мой временный результат. Я получаю сообщение об ошибке «DECLARE»

/* Ошибка SQL (1064): У вас возникла ошибка в синтаксисе SQL; проверить руководство, которое соответствует Вашей версии сервера MySQL для правого синтаксиса использовать вблизи 'DECLARE @cols AS NVARCHAR (MAX), @query AS NVARCHAR (MAX)

выберите @cols =' в строке 2 // 2 строки затронуты, найдено 2 строки. Продолжительность 3 из 4 запросов: 0,000 сек. */

Может ли кто-нибудь помочь?

+0

Вы можете редактировать ваш OP с некоторыми выборочными данными, а затем желаемым результатом? – Taryn

+0

уверен, сделаю это. – LStrike

ответ

1

MySQL Не имеет сводную функции, так что вы должны перенести данные из строк в столбцы с помощью агрегатной функции с выражением CASE:

select 
    sum(case when tt.type = 'UnitTest' then 1 else 0 end) UnitTest, 
    sum(case when tt.type = 'WebTest' then 1 else 0 end) WebTest 
from test t 
inner join test_type tt 
    on t.test_type = tt.id 

См SQL Fiddle with Demo.

Если вы собираетесь иметь неизвестное количество types, которые вы хотите преобразовать в столбцы, вы можете использовать подготовленное заявление для создания динамического SQL:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'sum(CASE WHEN tt.type = ''', 
     type, 
     ''' THEN 1 else 0 END) AS `', 
     type, '`' 
    ) 
) INTO @sql 
FROM test_type; 

SET @sql 
    = CONCAT('SELECT ', @sql, ' 
      from test t 
      inner join test_type tt 
       on t.test_type = tt.id'); 

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

См SQL Fiddle with Demo

+0

Благодарю вас, я всегда должен работать так, или есть более общий способ сделать транспозицию? Например, если добавлен новый тип теста [edit - to slow ;-)] – LStrike

+0

это замечательно, большое спасибо – LStrike

+0

@LStrike Добро пожаловать! Рад был помочь! – Taryn

Смежные вопросы