2013-04-04 52 views
0

刚刚与MySQL服务器上的一些SQL语句5.1 我已经问了一个问题,如何使两个表的具体数量玩耍(见here) ,我也找到了答案如何调换我的结果(见here),但我不能在我的本地MYSQL服务器5.1上使用它。在MYSQL使用@DECLARE 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; 

我无法运行我想要转移临时结果的最后部分。我收到“DECLARE”错误

/* SQL错误(1064):您的SQL语法错误;在第2行检查对应于你的MySQL服务器版本的权利 语法使用附近的 手册 '声明为NVARCHAR(MAX)@cols, @query AS NVARCHAR(MAX)

选择@cols ='// 2行受影响,找到2行。 4个查询中的3个的持续时间:0,000秒。 */

任何人都可以帮忙吗?

+0

您可以编辑您OP与一些样本数据,然后所需的结果? – Taryn 2013-04-04 12:28:18

+0

当然,会做到这一点。 – LStrike 2013-04-04 12:38:10

回答

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

谢谢,我是否总是要这样工作,还是有更一般的方法来进行换位?例如,如果增加了一个新的测试类型[编辑 - 减慢;-)] – LStrike 2013-04-04 12:49:51

+0

这是伟大的,非常感谢 – LStrike 2013-04-04 12:50:30

+0

@LStrike欢迎您!乐于帮助! – Taryn 2013-04-04 13:06:47