2

私のデータベースは次のように構成されています。

Number | Month | Country
------------------------
63     | June  | Ireland
48     | June  | England
55     | June  | Spain
66     | May   | Ireland
33     | May   | England
53     | May   | Spain
44     | April | Ireland
44     | April | England
44     | April | Spain

上記のデータからこれを呼び出すためにSQLステートメントを使用したいと思います。誰か助けてくれませんか。基本的に、関連する月に応じて、数値列を他の複数の列に分割したいと思います。私はsql-server2000を使用しています

Country | June | May | April
---------------------------
Ireland | 63   | 66  |  44
England | 48   | 33  |  44
Spain   | 55   | 53  |  44
4

2 に答える 2

6

このプロセスはピボットと呼ばれます。それを行う1つの方法:

 select  Country
 ,       sum(case when Month = 'June' then Number end) as June
 ,       sum(case when Month = 'May' then Number end) as May
 ,       sum(case when Month = 'April' then Number end) as April
 from    YourTable
 group by
         Country
于 2012-07-30T15:53:30.907 に答える
2

これを試してください。このクエリでは、一意の月数に関係なく適切な結果が得られます。つまり、月の名前を列名としてハードコーディングする必要はありません。

CREATE TABLE tbl1(Number int,Months varchar(10),Country varchar(10))
INSERT INTO tbl1
VALUES(63,'June','Ireland'),
(48,'June','England'),
(55,'June','Spain'),
(66,'May','Ireland'),
(33,'May','England'),
(53,'May','Spain'),
(44,'April','Ireland'),
(44,'April','England'),
(44,'April','Spain')

DECLARE @month_colms varchar(100)
DECLARE @sqlstr varchar(1000)
DECLARE @colname varchar(100)
select @month_colms=STUFF((select ', '+months from (select months from tbl1 group by months) a for xml path('')),1,1,'')
SET @sqlstr=''
While(CHARINDEX(',',@month_colms,1)>0)
BEGIN
SELECT @colname=LEFT(ltrim(rtrim(@month_colms)),CHARINDEX(',',ltrim(rtrim(@month_colms)),1)-1)
SET @month_colms=RIGHT(ltrim(rtrim(@month_colms)),LEN(ltrim(rtrim(@month_colms)))-CHARINDEX(',',ltrim(rtrim(@month_colms)),1))
SET @sqlstr=@sqlstr+','+'sum(case when Months = '''+@colname+''' then Number end) as '''+@colname+''''
END

SET @sqlstr=@sqlstr+','+'sum(case when Months = '''+ltrim(rtrim(@month_colms))+''' then Number end) as '''+@month_colms+''''

exec('select  Country'+@sqlstr+' from tbl1 group by Country')
于 2012-07-30T16:32:06.023 に答える