0

MYSQL Server 5.1でいくつかのSQLステートメントをいじっているだけです。2つのテーブルで特定のカウントを行う方法をすでに質問しました(こちらを参照。また、結果を転置する方法(こちらを参照)の回答も見つけましたが、使用できません私のローカルMYSQL Server 5.1.

これはテーブル 1 です: テスト

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

2 番目のテーブル: 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 構文にエラーがあります。'DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

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 に答える