Question

In the below query, I want to cast Dense Rank function as nvarchar(255) but it is giving syntax error. I have following questions -

  1. Is it possible to cast a value returned out of dense rank function?
  2. If yes, what is the syntax?

 SELECT cast('P' AS NVARCHAR(3))                                                                                                                                                                                                            AS ADDRESS_TYPE_CD,
       DENSE_RANK() OVER(PARTITION BY [CUSTOMER KEY] 
                             ORDER BY [PRIMARY ADDRESS LINE 1], 
                                      [PRIMARY ADDRESS LINE 2], 
                                      [PRIMARY ADDRESS LINE 3] + [PRIMARY ADDRESS LINE 4], 
                                      [PRIMARY CITY], 
                                      [PRIMARY STATE], 
                                      [PRIMARY ZIP], 
                                      [PRIMARY COUNTRY] ) AS ADDRESS_FLAG,
       [CUSTOMER KEY],
       [PRIMARY ADDRESS LINE 1]                                                                                                                                                                                                            AS PA1,
       CASE
         WHEN [PRIMARY ADDRESS LINE 1] = [PRIMARY ADDRESS LINE 2] THEN NULL
         ELSE [PRIMARY ADDRESS LINE 2]
       END                                                                                                                                                                                                                                 AS PA2,
       [PRIMARY ADDRESS LINE 3] + [PRIMARY ADDRESS LINE 4]                                                                                                                                                                                 AS PA3,
       [PRIMARY CITY]                                                                                                                                                                                                                      AS PCity,
       [PRIMARY STATE]                                                                                                                                                                                                                     AS PS,
       [PRIMARY ZIP]                                                                                                                                                                                                                       AS PZ,
       [PRIMARY COUNTRY]                                                                                                                                                                                                                   AS PC
FROM   mtb.DBO.EnrichedFile
WHERE  APPLICATION <> 'RBC' 
Était-ce utile?

La solution

SELECT 
 CAST((DENSE_RANK() OVER(PARTITION BY [CUSTOMER KEY] 
                            ORDER BY [MAILING ADDRESS LINE 1],
                                     [MAILING ADDRESS LINE 2],
                                     [MAILING ADDRESS LINE 3]+[MAILING ADDRESS LINE 4],
                                     [MAILING CITY],
                                     [MAILING STATE],
                                     [MAILING ZIP],
                                     [MAILING COUNTRY]) as nvarchar(255)) AS ADDRESS_FLAG

Should be

SELECT 
 CAST(DENSE_RANK() OVER(PARTITION BY [CUSTOMER KEY] 
                            ORDER BY [MAILING ADDRESS LINE 1],
                                     [MAILING ADDRESS LINE 2],
                                     [MAILING ADDRESS LINE 3]+[MAILING ADDRESS LINE 4],
                                     [MAILING CITY],
                                     [MAILING STATE],
                                     [MAILING ZIP],
                                     [MAILING COUNTRY]) as nvarchar(255)) AS ADDRESS_FLAG

You have a surplus opening bracket.

Why are you casting this to nvarchar(255) anyway though?

Even if there is some legitimate reason for wanting it as a string the maximum value it can possibly have is 9223372036854775807 so varchar(19) would be sufficient.

Autres conseils

Here you go:

SELECT CAST(ADDRESS_FLAG AS NVARCHAR(255)) AS ADDRESS_FLAG_STR,
       --... blah blah blah
FROM
(
 SELECT --.. blah blah blah
        DENSE_RANK() ... blah blah ...  AS ADDRESS_FLAG,
        --... blah blah blah
) SUB

I've found with the OVER function you need to put them in a sub query before you can manipulate them. There are just a few things you can do with as if they were a normal field -- you can always refactor once you get the query working.

cast(DENSE_RANK() OVER(PARTITION BY [CUSTOMER KEY] ORDER BY [PRIMARY ADDRESS LINE 1],[PRIMARY ADDRESS LINE 2],[PRIMARY ADDRESS LINE 3] + [PRIMARY ADDRESS LINE 4],[PRIMARY CITY],[PRIMARY STATE],[PRIMARY ZIP],[PRIMARY COUNTRY] ) as nvarchar(255)) AS ADDRESS_FLAG 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top