Sql server 如何从已创建的查询中引用列

Sql server 如何从已创建的查询中引用列,sql-server,tsql,Sql Server,Tsql,在这段代码中,我想使用从查询中创建的“我的物料日期”列作为数字2是否出现在“2”列中的指示符。我在第2列中想要的伪代码是: 如果[Materials]为空,则“2”这是我在上一个Case语句中尝试的内容。如果我发布的内容不正确,我会重新登录,这是我在这个网站上的第一个SQL作业/帖子 USE [MARKData] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SELECT DISTINCT ord.[OrderID] AS 'Qu

在这段代码中,我想使用从查询中创建的“我的物料日期”列作为数字2是否出现在“2”列中的指示符。我在第2列中想要的伪代码是: 如果[Materials]为空,则“2”这是我在上一个Case语句中尝试的内容。如果我发布的内容不正确,我会重新登录,这是我在这个网站上的第一个SQL作业/帖子

USE [MARKData]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


SELECT DISTINCT
 ord.[OrderID] AS 'Quote #',
 Null As 'T',
 con.[FirstName] +  ' ' + con.[LastName] AS 'Customer Name',
 stat.[StatusDescription] AS 'Current Status',
  '$' + CONVERT(varchar(12), ord.[OrderTotal], 1) AS 'Current Total',
 stath.[UpdateDate] AS 'Last Status Update',
 (DATEDIFF(DAY, GETDATE(), ord.[OrderSubmitDate]) * -1) AS 'Current Elapsed Days',

CASE 
 WHEN stath.[OrderStatusID] = 35
 THEN stath.[CreateDate]
ELSE
 CASE
  WHEN stath.[CreateDate] >= MatPriceRev.[CreateDate]
  THEN MatPriceRev.[CreateDate]
  ELSE NULL  
 END
END AS 'Materials',

CASE 
 WHEN stath.[OrderStatusID] = 34
 THEN stath.[CreateDate]
ELSE
 CASE
  WHEN stath.[CreateDate] >= EngineerRev.[CreateDate]
  THEN EngineerRev.[CreateDate]
  ELSE NULL  
 END
END AS 'Engineer Notified',

 ConSales.[FirstName] +  ' ' + ConSales.[LastName] AS 'Sales Rep', 

CASE
 WHEN ord.[CreateDate] < (CURRENT_TIMESTAMP)
 THEN '1'
END AS '1',

CASE
 WHEN 'Materials' IS NULL
 THEN '2'
END AS '2'


FROM T_Order ord
 LEFT JOIN T_Contact con ON ord.[ContactID] = con.[ContactID]
 LEFT JOIN T_Contact ConSales ON ord.CreateUser = ConSales.[ContactID]
 LEFT JOIN T_OrderStatusHistory stath ON ord.[OrderID] = stath.[OrderID]
 LEFT JOIN T_OrderStatus stat ON stath.[OrderStatusID] = stat.[OrderStatusID]
 LEFT JOIN 
 (Select * From T_OrderStatusHistory Where T_OrderStatusHistory.[OrderStatusID] = 35) AS MatPriceRev 
  ON MatPriceRev.[OrderID] = ord.[OrderID]
 LEFT JOIN 
 (Select * From T_OrderStatusHistory Where T_OrderStatusHistory.[OrderStatusID] = 34) AS EngineerRev 
  ON EngineerRev.[OrderID] = ord.[OrderID]
 LEFT JOIN
 (Select * From T_OrderStatusHistory Where T_OrderStatusHistory.[OrderStatusID] = 41) AS RiskRev 
  ON RiskRev.[OrderID] = ord.[OrderID]



WHERE
 DATEDIFF(DAY, ord.OrderSubmitDate, GETDATE()) >= 0
 AND stath.[CurrentIndicator] = 'True' 
 AND stath.[OrderStatusID] <> 2

ORDER BY 'Quote #' ASC, 'Last Status Update' ASC
试试-


SQL Server不允许在同一查询中使用计算列。解决此问题的一种方法是将查询包装在CTE中,然后允许您在后续查询中引用计算列:

;WITH tmp AS (
SELECT DISTINCT
 ord.[OrderID] AS 'Quote #',
 Null As 'T',
 con.[FirstName] +  ' ' + con.[LastName] AS 'Customer Name',
 stat.[StatusDescription] AS 'Current Status',
  '$' + CONVERT(varchar(12), ord.[OrderTotal], 1) AS 'Current Total',
 stath.[UpdateDate] AS 'Last Status Update',
 (DATEDIFF(DAY, GETDATE(), ord.[OrderSubmitDate]) * -1) AS 'Current Elapsed Days',

CASE 
 WHEN stath.[OrderStatusID] = 35
 THEN stath.[CreateDate]
ELSE
 CASE
  WHEN stath.[CreateDate] >= MatPriceRev.[CreateDate]
  THEN MatPriceRev.[CreateDate]
  ELSE NULL  
 END
END AS 'Materials',

CASE 
 WHEN stath.[OrderStatusID] = 34
 THEN stath.[CreateDate]
ELSE
 CASE
  WHEN stath.[CreateDate] >= EngineerRev.[CreateDate]
  THEN EngineerRev.[CreateDate]
  ELSE NULL  
 END
END AS 'Engineer Notified',

 ConSales.[FirstName] +  ' ' + ConSales.[LastName] AS 'Sales Rep', 

CASE
 WHEN ord.[CreateDate] < (CURRENT_TIMESTAMP)
 THEN '1'
END AS '1',

FROM T_Order ord
 LEFT JOIN T_Contact con ON ord.[ContactID] = con.[ContactID]
 LEFT JOIN T_Contact ConSales ON ord.CreateUser = ConSales.[ContactID]
 LEFT JOIN T_OrderStatusHistory stath ON ord.[OrderID] = stath.[OrderID]
 LEFT JOIN T_OrderStatus stat ON stath.[OrderStatusID] = stat.[OrderStatusID]
 LEFT JOIN 
 (Select * From T_OrderStatusHistory Where T_OrderStatusHistory.[OrderStatusID] = 35) AS MatPriceRev 
  ON MatPriceRev.[OrderID] = ord.[OrderID]
 LEFT JOIN 
 (Select * From T_OrderStatusHistory Where T_OrderStatusHistory.[OrderStatusID] = 34) AS EngineerRev 
  ON EngineerRev.[OrderID] = ord.[OrderID]
 LEFT JOIN
 (Select * From T_OrderStatusHistory Where T_OrderStatusHistory.[OrderStatusID] = 41) AS RiskRev 
  ON RiskRev.[OrderID] = ord.[OrderID]



WHERE
 DATEDIFF(DAY, ord.OrderSubmitDate, GETDATE()) >= 0
 AND stath.[CurrentIndicator] = 'True' 
 AND stath.[OrderStatusID] <> 2
)

SELECT    *,
          CASE WHEN Materials IS NULL THEN 2 END AS [2]
FROM      tmp
ORDER BY  [Quote #], [Last Status Update]
;WITH tmp AS (
SELECT DISTINCT
 ord.[OrderID] AS 'Quote #',
 Null As 'T',
 con.[FirstName] +  ' ' + con.[LastName] AS 'Customer Name',
 stat.[StatusDescription] AS 'Current Status',
  '$' + CONVERT(varchar(12), ord.[OrderTotal], 1) AS 'Current Total',
 stath.[UpdateDate] AS 'Last Status Update',
 (DATEDIFF(DAY, GETDATE(), ord.[OrderSubmitDate]) * -1) AS 'Current Elapsed Days',

CASE 
 WHEN stath.[OrderStatusID] = 35
 THEN stath.[CreateDate]
ELSE
 CASE
  WHEN stath.[CreateDate] >= MatPriceRev.[CreateDate]
  THEN MatPriceRev.[CreateDate]
  ELSE NULL  
 END
END AS 'Materials',

CASE 
 WHEN stath.[OrderStatusID] = 34
 THEN stath.[CreateDate]
ELSE
 CASE
  WHEN stath.[CreateDate] >= EngineerRev.[CreateDate]
  THEN EngineerRev.[CreateDate]
  ELSE NULL  
 END
END AS 'Engineer Notified',

 ConSales.[FirstName] +  ' ' + ConSales.[LastName] AS 'Sales Rep', 

CASE
 WHEN ord.[CreateDate] < (CURRENT_TIMESTAMP)
 THEN '1'
END AS '1',

FROM T_Order ord
 LEFT JOIN T_Contact con ON ord.[ContactID] = con.[ContactID]
 LEFT JOIN T_Contact ConSales ON ord.CreateUser = ConSales.[ContactID]
 LEFT JOIN T_OrderStatusHistory stath ON ord.[OrderID] = stath.[OrderID]
 LEFT JOIN T_OrderStatus stat ON stath.[OrderStatusID] = stat.[OrderStatusID]
 LEFT JOIN 
 (Select * From T_OrderStatusHistory Where T_OrderStatusHistory.[OrderStatusID] = 35) AS MatPriceRev 
  ON MatPriceRev.[OrderID] = ord.[OrderID]
 LEFT JOIN 
 (Select * From T_OrderStatusHistory Where T_OrderStatusHistory.[OrderStatusID] = 34) AS EngineerRev 
  ON EngineerRev.[OrderID] = ord.[OrderID]
 LEFT JOIN
 (Select * From T_OrderStatusHistory Where T_OrderStatusHistory.[OrderStatusID] = 41) AS RiskRev 
  ON RiskRev.[OrderID] = ord.[OrderID]



WHERE
 DATEDIFF(DAY, ord.OrderSubmitDate, GETDATE()) >= 0
 AND stath.[CurrentIndicator] = 'True' 
 AND stath.[OrderStatusID] <> 2
)

SELECT    *,
          CASE WHEN Materials IS NULL THEN 2 END AS [2]
FROM      tmp
ORDER BY  [Quote #], [Last Status Update]