2014-09-05 4 views
0

В настоящее время у меня есть данные в этом форматеSQL Server PIVOT запросов "Конверсия Failed"

Current Format

И я хотел бы в этом формате

Account AccountUnit Description ATL BOS 
1111  10   Trucking 23 50  
2222  13   Banking 34 21  

У меня есть мой запрос следующим образом

DECLARE 
@FISCAL_YEAR AS NVARCHAR(4), 
@PERIOD AS VARCHAR(2), 
@COL AS NVARCHAR(MAX), 
@SQL AS NVARCHAR(MAX) 

SELECT @COL= COALESCE (@COL+ ',','')+QUOTENAME(MX_VALUE)FROM 
(SELECT DISTINCT MX_VALUE FROM AUMXVALUE WHERE MATRIX_CAT='_DIV') AS A 

SET @FISCAL_YEAR = 2014 
SET @PERIOD=6 


SET @SQL= 
N' 
SELECT CURR.COMPANY, CURR.ACCT_UNIT, CURR.DESCRIPTION, CURR.ACCOUNT, 
(
(SELECT UNITS.* , GLN.DESCRIPTION FROM 
(SELECT 
GLU.COMPANY, 
GLU.ACCT_UNIT, 
GLU.ACCOUNT, 
AMV.MATRIX_CAT, 
'[email protected]+', 
CASE 
WHEN @PERIOD=1 THEN GLU.DB_UNITS_01+GLU.CR_UNITS_01 
WHEN @PERIOD=2 THEN GLU.DB_UNITS_02+GLU.CR_UNITS_02 
WHEN @PERIOD=3 THEN GLU.DB_UNITS_03+GLU.CR_UNITS_03 
WHEN @PERIOD=4 THEN GLU.DB_UNITS_04+GLU.CR_UNITS_04 
WHEN @PERIOD=5 THEN GLU.DB_UNITS_05+GLU.CR_UNITS_05 
WHEN @PERIOD=6 THEN GLU.DB_UNITS_06+GLU.CR_UNITS_06 
WHEN @PERIOD=7 THEN GLU.DB_UNITS_07+GLU.CR_UNITS_07 
WHEN @PERIOD=8 THEN GLU.DB_UNITS_08+GLU.CR_UNITS_08 
WHEN @PERIOD=9 THEN GLU.DB_UNITS_09+GLU.CR_UNITS_09 
WHEN @PERIOD=10 THEN GLU.DB_UNITS_10+GLU.CR_UNITS_10 
WHEN @PERIOD=11 THEN GLU.DB_UNITS_11+GLU.CR_UNITS_11 
WHEN @PERIOD=12 THEN GLU.DB_UNITS_12+GLU.CR_UNITS_12 
ELSE 0 END AS ACT 
FROM GLUNITS GLU JOIN GLNAMES GLN 
ON GLU.COMPANY=GLN.COMPANY 
AND GLU.ACCT_UNIT='''+100+''' 
JOIN AUMXVALUE AMV 
ON GLN.OBJ_ID=AMV.OBJ_ID 
AND AMV.MATRIX_CAT='''+'_DIV'+''' 
AND [email protected]_YEAR 
AND GLU.ACCOUNT=9100 
)UNITS 
JOIN GLNAMES GLN 
ON UNITS.COMPANY=GLN.COMPANY 
AND UNITS.ACCT_UNIT=GLN.ACCT_UNIT) CURR 
) T PIVOT(SUM(ACT) FOR MX_VALUE IN (' + @COL + ')) AS PIVTBL' 


EXEC (@SQL) 

Но я получаю эту ошибку

Conversion failed when converting the nvarchar value ' 

SELECT CURR.COMPANY, CURR.ACCT_UNIT, CURR.DESCRIPTION, CURR.ACCOUNT, 
(
(SELECT UNITS.* , GLN.DESCRIPTION FROM 
(SELECT 
GLU.COMPANY, 
GLU.ACCT_UNIT, 
GLU.ACCOUNT, 
AMV.MATRIX_CAT, 
[ATL        ],[BOS        ] 
CASE 
    WHEN @PERIOD=1 THEN GLU.DB_UNITS_01+GLU.CR_UNITS_01 
    WHEN @PERIOD=2 THEN GLU.DB_UNITS_02+GLU.CR_UNITS_02 
    WHEN @PERIOD=3 THEN GLU.DB_UNITS_03+GLU.CR_UNITS_03 
WHEN @PERIOD=4 THEN GLU.DB_UNITS_04+GLU.CR_UNITS_04 
WHEN @PERIOD=5 THEN GLU.DB_UNITS_05+GLU.CR_UNITS_05 
WHEN @PERIOD=6 THEN GLU.DB_UNITS_06+GLU.CR_UNITS_06 
WHEN @PERIOD=7 THEN GLU.DB_UNITS_07+GLU.CR_UNITS_07 
WHEN @PERIOD=8 THEN GLU.DB_UNITS_08+GLU.CR_UNITS_08 
WHEN @PERIOD=9 THEN GLU.DB_UNITS_09+GLU.CR_UNITS_09 
WHEN @PERIOD=10 THEN GLU.DB_UNITS_10+GLU.CR_UNITS_10 
WHEN @PERIOD=11 THEN GLU.DB_UNIT... 

Любые идеи? Заранее благодарны за Вашу помощь.

+0

Как насчет DDL и выборки данных? sqlfiddle.com - отличное место для начала. –

+0

Что вы выплюнете, если вы 'print @ SQL'? – Taryn

+0

Попробуйте объявить '@ SQL' как' VARCHAR'. –

ответ

0

Вы должны бросить в VARCHAR100, а так:

... 
AND GLU.ACCT_UNIT='''+CAST(100 AS VARCHAR(3))+''' 
... 

или просто добавить его в виде строки, как это:

... 
AND GLU.ACCT_UNIT='''+'100'+''' 
... 
0

Спасибо PM77-1 и gotqn

Я пробовал ваши предложения, и теперь я получаю следующее: Должен объявить скалярную переменную «@PERIOD».

Вот мой модифицированный код в соответствии с вашими предложениями:

DECLARE 
@FISCAL_YEAR AS VARCHAR(4), 
@PERIOD AS VARCHAR(2), 
@COL AS VARCHAR(MAX), 
@SQL AS VARCHAR(MAX) 

SELECT @COL= COALESCE (@COL+ ',','')+QUOTENAME(MX_VALUE)FROM 
(SELECT DISTINCT MX_VALUE FROM AUMXVALUE WHERE MATRIX_CAT='_DIV') AS A 

SET @FISCAL_YEAR = 2014 
SET @PERIOD=6 


    SET @SQL= 
N' 
SELECT CURR.COMPANY, CURR.ACCT_UNIT, CURR.DESCRIPTION, CURR.ACCOUNT, 
(
(SELECT UNITS.* , GLN.DESCRIPTION FROM 
(SELECT 
GLU.COMPANY, 
GLU.ACCT_UNIT, 
GLU.ACCOUNT, 
AMV.MATRIX_CAT, 
'[email protected]+', 
CASE 
WHEN @PERIOD=1 THEN GLU.DB_UNITS_01+GLU.CR_UNITS_01 
WHEN @PERIOD=2 THEN GLU.DB_UNITS_02+GLU.CR_UNITS_02 
WHEN @PERIOD=3 THEN GLU.DB_UNITS_03+GLU.CR_UNITS_03 
WHEN @PERIOD=4 THEN GLU.DB_UNITS_04+GLU.CR_UNITS_04 
WHEN @PERIOD=5 THEN GLU.DB_UNITS_05+GLU.CR_UNITS_05 
WHEN @PERIOD=6 THEN GLU.DB_UNITS_06+GLU.CR_UNITS_06 
WHEN @PERIOD=7 THEN GLU.DB_UNITS_07+GLU.CR_UNITS_07 
WHEN @PERIOD=8 THEN GLU.DB_UNITS_08+GLU.CR_UNITS_08 
WHEN @PERIOD=9 THEN GLU.DB_UNITS_09+GLU.CR_UNITS_09 
WHEN @PERIOD=10 THEN GLU.DB_UNITS_10+GLU.CR_UNITS_10 
WHEN @PERIOD=11 THEN GLU.DB_UNITS_11+GLU.CR_UNITS_11 
WHEN @PERIOD=12 THEN GLU.DB_UNITS_12+GLU.CR_UNITS_12 
ELSE 0 END AS ACT 
FROM GLUNITS GLU JOIN GLNAMES GLN 
ON GLU.COMPANY=GLN.COMPANY 
AND GLU.ACCT_UNIT='''+'100'+''' 
JOIN AUMXVALUE AMV 
ON GLN.OBJ_ID=AMV.OBJ_ID 
AND AMV.MATRIX_CAT='''+'_DIV'+''' 
AND [email protected]_YEAR 
AND GLU.ACCOUNT=9100 
)UNITS 
JOIN GLNAMES GLN 
ON UNITS.COMPANY=GLN.COMPANY 
AND UNITS.ACCT_UNIT=GLN.ACCT_UNIT) CURR 
) T PIVOT(SUM(ACT) FOR MX_VALUE IN (' + @COL + ')) AS PIVTBL' 


EXEC (@SQL) 

Благодарности