【问题标题】:Todays date as column name今天的日期作为列名
【发布时间】:2020-09-08 19:41:58
【问题描述】:

我试图让以下查询中的状态字段将今天的日期作为列别名:

SELECT      
    State,
    GroupNumber,
    FacilityNumber,
    CASE WHEN Pyes IS NULL THEN 0 ELSE Pyes END  AS PCY,
    CASE WHEN Pno IS NULL THEN 0 ELSE Pno END AS PCN,
    CASE WHEN CYes IS NULL THEN 0 ELSE CYes END AS CTY,
    CASE WHEN CNo IS NULL THEN 0 ELSE CNo END AS CTN,
    CASE WHEN Appointed IS NULL THEN 0 ELSE Appointed END AS Appointed,
    CASE WHEN Super IS NULL THEN 0 ELSE Super END AS Super,
    CASE WHEN NFR IS NULL THEN 0 ELSE NFR END AS NFR,
    CASE WHEN RN IS NULL THEN 0 ELSE RN END AS RN,
    CASE WHEN Speech IS NULL THEN 0 ELSE Speech END AS Speech,
    CASE WHEN Occupation IS NULL THEN 0 ELSE Occupation END AS Occupation,
    CASE WHEN Physio IS NULL THEN 0 ELSE Physio END AS Physio,
    CASE WHEN EN IS NULL THEN 0 ELSE EN END AS EN,
    CASE WHEN Diet IS NULL THEN 0 ELSE Diet END AS Diet,
    CASE WHEN MD IS NULL THEN 0 ELSE MD END AS MD,
    CASE WHEN HW IS NULL THEN 0 ELSE HW END AS HW,
    CASE WHEN Cleaner IS NULL THEN 0 ELSE Cleaner END AS Cleaner,
    CASE WHEN Cook IS NULL THEN 0 ELSE Cook END AS Cook,
    CASE WHEN CSW IS NULL THEN 0 ELSE CSW END AS CSW,
    CASE WHEN GA IS NULL THEN 0 ELSE GA END AS GA,
    CASE WHEN [Tel/Chat] IS NULL THEN 0 ELSE [Tel/Chat] END AS 'Tel/Chat',
    CASE WHEN FPH IS NULL THEN 0 ELSE FPH END AS FPH
FROM DTE
ORDER BY CASE
WHEN State = 'ACT' THEN '1'
WHEN State = 'NSW' THEN '2'
WHEN State = 'NT' THEN '3'
WHEN State = 'QLD' THEN '4'
WHEN State = 'VIC' THEN '5'
WHEN State = 'SA' THEN '6'
WHEN State = 'WA' THEN '7'
WHEN State = 'TAS' THEN '8'
WHEN State = 'NULL' THEN '9'
END

我已尝试对上述内容使用动态 SQL 语句,但数据来自嵌套 CTE 语句并抛出错误 Invalid object name 'DTE':

DECLARE @dt NVARCHAR(50) = CAST(GETDATE() AS DATE)

DECLARE @SQL NVARCHAR(MAX) = '
SELECT      
    State AS ''' + @dt + ''',
    CASE WHEN Pyes IS NULL THEN 0 ELSE Pyes END  AS PCY,
    CASE WHEN Pno IS NULL THEN 0 ELSE Pno END AS PCN,
    CASE WHEN CYes IS NULL THEN 0 ELSE CYes END AS CTY,
    CASE WHEN CNo IS NULL THEN 0 ELSE CNo END AS CTN,
    CASE WHEN Appointed IS NULL THEN 0 ELSE Appointed END AS Appointed,
    CASE WHEN Super IS NULL THEN 0 ELSE Super END AS Super,
    CASE WHEN NFR IS NULL THEN 0 ELSE NFR END AS NFR,
    CASE WHEN RN IS NULL THEN 0 ELSE RN END AS RN,
    CASE WHEN Speech IS NULL THEN 0 ELSE Speech END AS Speech,
    CASE WHEN Occupation IS NULL THEN 0 ELSE Occupation END AS Occupation,
    CASE WHEN Physio IS NULL THEN 0 ELSE Physio END AS Physio,
    CASE WHEN EN IS NULL THEN 0 ELSE EN END AS EN,
    CASE WHEN Diet IS NULL THEN 0 ELSE Diet END AS Diet,
    CASE WHEN MD IS NULL THEN 0 ELSE MD END AS MD,
    CASE WHEN HW IS NULL THEN 0 ELSE HW END AS HW,
    CASE WHEN Cleaner IS NULL THEN 0 ELSE Cleaner END AS Cleaner,
    CASE WHEN Cook IS NULL THEN 0 ELSE Cook END AS Cook,
    CASE WHEN CSW IS NULL THEN 0 ELSE CSW END AS CSW,
    CASE WHEN GA IS NULL THEN 0 ELSE GA END AS GA,
    CASE WHEN [Tel/Chat] IS NULL THEN 0 ELSE [Tel/Chat] END AS ''Tel/Chat'',
    CASE WHEN FPH IS NULL THEN 0 ELSE FPH END AS FPH
FROM DTE
ORDER BY CASE
WHEN State = ''ACT'' THEN ''1''
WHEN State = ''NSW'' THEN ''2''
WHEN State = ''NT'' THEN ''3''
WHEN State = ''QLD'' THEN ''4''
WHEN State = ''SA'' THEN ''5''
WHEN State = ''WA'' THEN ''6''
WHEN State = ''TAS'' THEN ''7''
WHEN State = ''NULL'' THEN ''8''
END'

由于查询超过 4000 个字符,我也无法将整个查询放入动态 SQL 查询中。

【问题讨论】:

    标签: sql-server string tsql select dynamic-sql


    【解决方案1】:

    您可以通过使用ISNULL() 而不是这些多个CASE 表达式来大大缩短查询。例如,这个:

    CASE WHEN Pyes IS NULL THEN 0 ELSE Pyes END  AS PCY
    

    可以改写成更短的:

    ISNULL(Pyes, 0) as PCY
    

    您还可以稍微缩短ORDER BY 子句,避免重复列名:

    ORDER BY CASE State
        WHEN 'ACT' THEN 1
        WHEN 'NSW' THEN 2
        WHEN 'NT'  THEN 3
        ...
        ELSE 8
    END
    

    这应该足以将您的语句的大小减少到 4000 个字符以下。

    如果仍然太长,那么一个典型的技巧是将查询拆分成更小的文本块(每个块的长度少于 4000 个字符)。然后,您可以使用 + 运算符将它们连接成一个字符串,这将神奇地允许超过 4000 个字符。

    旁注:

    • 不要使用单引号作为标识符 - 它们用于文字字符串。相反,请为您的数据库使用相关的引号字符(在 SQL Server 中,使用方括号)。所以这个:State AS ''' + @dt + ''' 应该写成State AS [' + @dt + ']

    • ORDER BY 子句应该使用数字而不是字符串 - 否则,如果您有 10 个或更多值,由于字符串排序规则(字符串明智,'10' 较小比'2')。

    • 最后一个 CASE 分支看起来不正确:这是根据 文字字符串 'NULL' 检查字符串,这可能不是您想要的(更好的是,使用 @987654335 @,如上图)

    【讨论】:

    • 恭喜获得 100K +1。可悲的是,SO 不再提供 100K 和 250K 的招摇包。几年前我花了 100K 买了一个,但错过了 250K 的套餐。
    • @TimBiegeleisen:谢谢,非常感谢!我什至不知道这些软件包的存在......猜猜现在 +10 万用户太多了!
    • 是的,这里的积分就像天空英里,多年来它们已经被稀释了。
    • 恭喜@GMB!干得好。
    • 不是“IFNULL”而是“ISNULL”
    猜你喜欢
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多