0

このリンクPivot tables in SQL Server を見つけました。簡単なサンプル。一時テーブルに変換しました。しかし、「'(' 付近の構文が正しくありません。」というエラーが表示されました。

IF OBJECT_ID('tempdb..#DailyIncome') IS NOT NULL
BEGIN
drop table #DailyIncome
END

create table #DailyIncome
       (
         VendorId nvarchar(10)
         , IncomeDay nvarchar(10)
         , IncomeAmount int
       )

insert into #DailyIncome values ('SPIKE', 'FRI', 100)
insert into #DailyIncome values ('SPIKE', 'MON', 300)
insert into #DailyIncome values ('FREDS', 'SUN', 400)
insert into #DailyIncome values ('SPIKE', 'WED', 500)
insert into #DailyIncome values ('SPIKE', 'TUE', 200)
insert into #DailyIncome values ('JOHNS', 'WED', 900)
insert into #DailyIncome values ('SPIKE', 'FRI', 100)
insert into #DailyIncome values ('JOHNS', 'MON', 300)
insert into #DailyIncome values ('SPIKE', 'SUN', 400)
insert into #DailyIncome values ('JOHNS', 'FRI', 300)
insert into #DailyIncome values ('FREDS', 'TUE', 500)
insert into #DailyIncome values ('FREDS', 'TUE', 200)
insert into #DailyIncome values ('SPIKE', 'MON', 900)
insert into #DailyIncome values ('FREDS', 'FRI', 900)
insert into #DailyIncome values ('FREDS', 'MON', 500)
insert into #DailyIncome values ('JOHNS', 'SUN', 600)
insert into #DailyIncome values ('SPIKE', 'FRI', 300)
insert into #DailyIncome values ('SPIKE', 'WED', 500)
insert into #DailyIncome values ('SPIKE', 'FRI', 300)
insert into #DailyIncome values ('JOHNS', 'THU', 800)
insert into #DailyIncome values ('JOHNS', 'SAT', 800)
insert into #DailyIncome values ('SPIKE', 'TUE', 100)
insert into #DailyIncome values ('SPIKE', 'THU', 300)
insert into #DailyIncome values ('FREDS', 'WED', 500)
insert into #DailyIncome values ('SPIKE', 'SAT', 100)
insert into #DailyIncome values ('FREDS', 'SAT', 500)
insert into #DailyIncome values ('FREDS', 'THU', 800)
insert into #DailyIncome values ('JOHNS', 'TUE', 600)

SELECT * FROM #DailyIncome

SELECT *
FROM #DailyIncome
pivot(avg(IncomeAmount) FOR IncomeDay IN (
        [MON]
        ,[TUE]
        ,[WED]
        ,[THU]
        ,[FRI]
        ,[SAT]
        ,[SUN]
        )) AS AvgIncomePerDay

みんなありがとう!

[アップデート]

コメントに基づいて、データベースは SQL Server 2000 を使用して作成されます。これに対する回避策はありますか?

4

2 に答える 2

0

ピボットはより簡潔になり、コードの行数も少なくなりました。構文が少しずれていました。最後のステートメントでこれを試してください。ステートメントを select 句でラップします。

SELECT * FROM 
(
SELECT *
FROM #DailyIncome
)Data
pivot(avg(IncomeAmount) FOR IncomeDay IN (
        [MON]
    ,[TUE]
    ,[WED]
    ,[THU]
    ,[FRI]
    ,[SAT]
    ,[SUN]
    ))

AS 1 日あたりの平均収入

于 2012-08-16T17:19:11.973 に答える
0

次のようなものを試すことができます

SELECT  VendorId,
        AVG(CASE
            WHEN IncomeDay = 'MON'
                THEN IncomeAmount
            ELSE NULL
        END) [MON],
        AVG(CASE
            WHEN IncomeDay = 'TUE'
                THEN IncomeAmount
            ELSE NULL
        END) [TUE],
        AVG(CASE
            WHEN IncomeDay = 'WED'
                THEN IncomeAmount
            ELSE NULL
        END) [WED],
        AVG(CASE
            WHEN IncomeDay = 'THU'
                THEN IncomeAmount
            ELSE NULL
        END) [THU],
        AVG(CASE
            WHEN IncomeDay = 'FRI'
                THEN IncomeAmount
            ELSE NULL
        END) [FRI],
        AVG(CASE
            WHEN IncomeDay = 'SAT'
                THEN IncomeAmount
            ELSE NULL
        END) [SAT],
        AVG(CASE
            WHEN IncomeDay = 'SUN'
                THEN IncomeAmount
            ELSE NULL
        END) [SUN]
FROM    #DailyIncome
GROUP BY VendorId

0 の代わりに NULLS を使用した理由は、PIVOT 機能によるものであることに注意してください。

PIVOT と UNPIVOT の使用から

集計関数が PIVOT で使用される場合、集計の計算時に、値列に null 値が存在しても考慮されません。

NULL の代わりに 0 を使用してクエリを実行すると、異なる結果が得られます。

于 2012-08-16T04:23:28.750 に答える