0

只是在 MYSQL Server 5.1 上玩一些 sql 语句我已经问过一个问题如何对两个表进行特定计数(见这里),我还找到了一个答案如何转置我的结果(见这里)但我不能用它我的本地 MYSQL Server 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;

我无法运行要转置临时结果的最后一部分。我收到“声明”错误

/* SQL 错误 (1064): 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 'DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) 附近使用正确的语法

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

有人可以帮忙吗?

4

1 回答 1

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

于 2013-04-04T12:41:09.667 回答