0

在下面的查询中,我想将 Dense Rank 函数转换为 nvarchar(255) 但它给出了语法错误。我有以下问题-

  1. 是否可以强制转换从密集排名函数返回的值?
  2. 如果是,语法是什么?

 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' 
4

3 回答 3

1
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

应该

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

你有一个多余的左括号。

nvarchar(255)无论如何,您为什么要这样做?

即使有一些合法的理由希望它作为一个字符串,它可能拥有的最大值也9223372036854775807足够了varchar(19)

于 2014-03-07T15:21:19.553 回答
0

干得好:

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

我发现使用 OVER 函数需要将它们放在子查询中,然后才能操作它们。您可以做一些事情,就好像它们是一个普通的字段一样——一旦您的查询工作,您总是可以重构。

于 2014-03-07T15:10:33.503 回答
0
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 
于 2014-03-07T15:34:23.970 回答