簡體   English   中英

在DATEDIFF之后使用CASE邏輯

[英]Using CASE logic after DATEDIFF

我正在成功使用DATEDIFF邏輯來計算Age。 然后,我需要能夠使用Age並將其用作CASE邏輯中的一列。 當我嘗試這樣做時,SMS用紅色下划線標記Age(年齡),並指出這是無效列。 我怎樣才能解決這個問題?

USE DataWarehouse
SELECT DISTINCT
M.[Account Name Birth Date] as 'Birth Date',
M.[Mailing Address State] as 'State',
E.[ANSVIES2] as 'Income',
E.[FICO] as 'FICO Score',

DATEDIFF(DD,M.[Account Name Birth Date],GETDATE())/365 as [Age],

CASE WHEN [Age] >= 18 AND [Age] <= 34 AND E.[ANSVIES2] >= 50 THEN 'Credit 
Driven'
WHEN [Age] < 45 AND E.[ANSVIES2] < 50 THEN 'Fee Driven'
WHEN [Age] >= 35 AND [Age] <= 54 AND E.[ANSVIES2] >= 50 AND E.[ANSVIES2] <= 
125 THEN 'Middle Market'
WHEN [Age] >= 45 AND E.[ANSVIES2] < 50 THEN 'Low Income Depositor'
WHEN [Age] >= 55 AND E.[ANSVIES2] >= 50 AND E.[ANSVIES2] <= 125 THEN 'Middle 
Income Depositor'
WHEN [Age] >= 35 AND E.[ANSVIES2] >= 125 THEN 'Upscale'
ELSE 'Unclassified' END as 'Consumer Segment'

或使用子選擇(不是最佳方法,具體取決於您的數據庫大小和索引,臨時表或臨時表可能會更好,具體取決於您的位置,但這應該可以):

   Select CASE WHEN [Age] >= 18 AND [Age] <= 34 AND E.[ANSVIES2] >= 50 THEN 'Credit 
Driven'
WHEN [Age] < 45 AND E.[ANSVIES2] < 50 THEN 'Fee Driven'
WHEN [Age] >= 35 AND [Age] <= 54 AND E.[ANSVIES2] >= 50 AND E.[ANSVIES2] <= 
125 THEN 'Middle Market'
WHEN [Age] >= 45 AND E.[ANSVIES2] < 50 THEN 'Low Income Depositor'
WHEN [Age] >= 55 AND E.[ANSVIES2] >= 50 AND E.[ANSVIES2] <= 125 THEN 'Middle 
Income Depositor'
WHEN [Age] >= 35 AND E.[ANSVIES2] >= 125 THEN 'Upscale'
ELSE 'Unclassified' END as 'Consumer Segment'
, OtherColumnsHere
FROM (
     SELECT DISTINCT
     M.[Account Name Birth Date] as 'Birth Date',
     M.[Mailing Address State] as 'State',
     E.[ANSVIES2] as 'Income',
     E.[FICO] as 'FICO Score',    
     DATEDIFF(DD,M.[Account Name Birth Date],GETDATE())/365 as [Age],
     FROM RestOfYourSelectStatementHere
) SubSelect

SSMS突出顯示語法的原因是由於SQL邏輯處理順序

簡而言之,在選擇階段中使用的別名“ Age ”不能在同一階段中引用-可以在后續階段中引用(例如,下一階段-ORDER BY )。

因此,一項工作是創建CTE嵌套表

查詢的邏輯步驟順序:

  1. 從/加入/申請/ PIVOT / UNPIVOT
  2. 哪里
  3. 通過...分組
  4. HAVING
  5. 選擇列表/ DISTINCT
  6. 訂購
  7. 上下偏移

您不需要使用subquery您可以直接將其表示為使用value構造:

 SELECT  . . . ,
        (CASE WHEN tt.Age >= 18 AND tt.Age <= 34 AND t.[ANSVIES2] >= 50 
              THEN 'Credit Driven'
              WHEN [Age] < 45 AND E.[ANSVIES2] < 50 THEN 'Fee Driven'
              WHEN [Age] >= 35 AND [Age] <= 54 AND 
                   E.[ANSVIES2] >= 50 AND E.[ANSVIES2] <= 125 
              THEN 'Middle Market'
              WHEN [Age] >= 45 AND E.[ANSVIES2] < 50 
              THEN 'Low Income Depositor'
              WHEN [Age] >= 55 AND E.[ANSVIES2] >= 50 AND E.[ANSVIES2] <= 125 
              THEN 'Middle Income Depositor'
              WHEN [Age] >= 35 AND E.[ANSVIES2] >= 125 THEN 'Upscale'
              ELSE 'Unclassified'
         END) AS [Consumer Segment]
FROM table t 
CROSS APPLY (VALUES 
                (DATEDIFF(DD, t.[Account Name Birth Date],GETDATE())/365)
            ) tt(Age); 

上面發布的代碼由於某些原因無法正常工作。 我能夠成功實現此解決方案-

USE DataWarehouse
SELECT DISTINCT
M.[Symitar Account Id] as 'Symitar ID',
M.[Account Name Birth Date] as 'Birth Date',
M.[Account Name Death Date] as 'Death Date',
M.[Mailing Address State] as 'State',
E.[ANSVIES2] as 'Income',
E.[FICO] as 'FICO Score',
M.[Loan Type] as 'Loan Description',
M.[Loan Type Code] as 'Loan Type',
M.[Share Type] as 'Share Description',
M.[Share Type Code] as 'Share Type',

DATEDIFF(DD,M.[Account Name Birth Date],GETDATE())/365 as [Age],

CASE WHEN DATEDIFF(DD,M.[Account Name Birth Date],GETDATE())/365 >= 18 AND 
DATEDIFF(DD,M.[Account Name Birth Date],
GETDATE())/365 <= 34 AND E.[ANSVIES2] >= 50 THEN 'Credit Driven'
WHEN DATEDIFF(DD,M.[Account Name Birth Date],GETDATE())/365 < 45 AND E. 
[ANSVIES2] < 50 THEN 'Fee Driven'
WHEN DATEDIFF(DD,M.[Account Name Birth Date],GETDATE())/365 >= 35 AND 
DATEDIFF(DD,M.[Account Name Birth Date],
GETDATE())/365 <= 54 AND E.[ANSVIES2] >= 50 AND E.[ANSVIES2] <= 125 THEN 
'Middle Market'
WHEN DATEDIFF(DD,M.[Account Name Birth Date],GETDATE())/365 >= 45 AND E. 
[ANSVIES2] < 50 THEN 'Low Income Depositor'
WHEN DATEDIFF(DD,M.[Account Name Birth Date],GETDATE())/365 >= 55 AND E. 
[ANSVIES2] >= 50 AND E.[ANSVIES2] <= 125 
THEN 'Middle Income Depositor'
WHEN DATEDIFF(DD,M.[Account Name Birth Date],GETDATE())/365 >= 35 AND E. 
[ANSVIES2] >= 125 THEN 'Upscale'
ELSE 'Unclassified' END as 'Consumer Segment'

FROM Accounts.ExperianData E
INNER JOIN Accounts.MemberCube M
ON E.[Symitar Account Id] = M.[Symitar Account Id]
WHERE M.[Account Name Type] = 'Primary' AND /* Primary acct holders */
M.[Account Status] = 'Open' AND 
M.[Account Type] IN ('General Membership', 'Indirect Account', 'Employee Acc 
ount') AND 
/* Remove businesses and internal accounts */
M.[Account Name Birth Date] <= '05/18/1997' /* Older than 21 */ AND
M.[Mailing Address State] IN('UT', 'ID', 'AZ', 'NV', 'NM') 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM