SQLServerのPIVOT絡みの処理
お世話になります。
従来はVB6のプログラム中で、従来ACCESSMDBからデータを取得していました。
これをDBを変更し、データ自体はOracle、接続先はSQLServer(2005)との仕組みに変更することとなりました。
(SQLServerのリンクサーバ機能にてOracleからデータを取得する)
ここで、元のアクセスにて行っていたクロス集計を移行するため
次のようなSQL文(メイン部位以外は端折ってます)を書いたのですが、
「オペランドのデータ型 nvarchar は sum 演算子では無効です」
との警告が出てしまいます。
(”SUM(oraData.suuryou)” を、”Count(oraData.suuryou)”とした場合はデータ取得できました。)
原因、及び回避策についてお知恵を拝借できませんでしょうか?
(PIVOT相当の処理をプログラム側で行うことで回避できますが、できればSQLで終えてしまいたいです)
SELECT
pvt.moji
,pvt.moji2
,SUM([01]), SUM([02]), SUM([03]), SUM([04]), SUM([05]), SUM([06]), SUM([07]), SUM([08]), SUM([09]), SUM([10])
,SUM([11]), SUM([12]), SUM([13]), SUM([14]), SUM([15]), SUM([16]), SUM([17]), SUM([18]), SUM([19]), SUM([20])
,SUM([21]), SUM([22]), SUM([23]), SUM([24]), SUM([25]), SUM([26]), SUM([27]), SUM([28]), SUM([29]), SUM([30])
,SUM([31])
From
openquery (LinkServerName, '
SELECT
moji
,moji2
,hiduke
,TO_CHAR(hiduke, ''dd'') AS dd
,hiduke
,suuryou
,Sum(suuryou) AS suuryou
FROM
table
WHERE
hiduke BETWEEN TO_DATE(''2008/04/01'', ''YYYY/MM/DD'') AND TO_DATE(''2008/04/30'', ''YYYY/MM/DD'')
UNION
SELECT
moji
,moji2
,hiduke
,TO_CHAR(hiduke, ''dd'') AS dd
,hiduke
,suuryou
,Sum(suuryou) AS suuryou
FROM
table
WHERE
hiduke BETWEEN TO_DATE(''2008/04/01'', ''YYYY/MM/DD'') AND TO_DATE(''2008/04/30'', ''YYYY/MM/DD'')
') AS oraData
PIVOT
(
SUM(oraData.suuryou)
FOR oraData.dd IN
(
[01], [02], [03], [04], [05], [06], [07], [08], [09], [10]
,[11], [12], [13], [14], [15], [16], [17], [18], [19], [20]
,[21], [22], [23], [24], [25], [26], [27], [28], [29], [30]
,[31]
)
) AS pvt
WHERE
moji = "xxx" OR moji2 = "yyy"
お礼
ありがとう御座います。 まさに求めていた値が取得できました。 oracleしか触れた事が無いためまだまだ 勉強不足でした・・・。 勉強します。