2013-04-04 28 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