/ / SQL Server PIVOT Query „Conversion Failed” - sql, sql-server, tsql

Zapytanie PIVOT programu SQL Server „Konwersja nie powiodła się” - sql, sql-server, tsql

Obecnie posiadam dane w tym formacie

Bieżący format

I chciałbym w tym formacie

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

Mam moje zapytanie w następujący sposób

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,
"+@COL+",
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 GLU.FISCAL_YEAR=@FISCAL_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)

Ale ciągle dostaję tego błędu

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...

Jakieś pomysły? Z góry dziękuję za pomoc.

Odpowiedzi:

0 dla odpowiedzi № 1

Musisz przesyłać jako VARCHAR temu 100 a także tak:

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

lub po prostu dodaj go jako ciąg w następujący sposób:

...
AND GLU.ACCT_UNIT="""+"100"+"""
...

0 dla odpowiedzi nr 2

Dzięki PM77-1 i gotqn

Wypróbowałem wasze sugestie i teraz otrzymuję to: Muszę zadeklarować zmienną skalarną „@PERIOD”.

Oto mój zmodyfikowany kod zgodnie z Twoimi sugestiami:

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,
"+@COL+",
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 GLU.FISCAL_YEAR=@FISCAL_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)

Dzięki