今天的日期作为列名

Todays date as column name

我正在尝试获取以下查询中的状态字段,以将今天的日期作为列别名:

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'

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

您可以使用 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 服务器中,使用方括号)。所以这个:State AS ''' + @dt + '''应该写成State AS [' + @dt + ']

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

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