简体   繁体   English

如何在SQL Server的where子句中使用新的输出

[英]How to use a new output in where clause in SQL Server

I'm executing this query and I want to add where Age > 120 , but since Age is not a column, I couldn't do it. 我正在执行此查询,我想where Age > 120添加内容,但是由于Age不是一列,因此无法执行。

Can you help me to do that 你能帮我做到吗

select 
    a.NUM_CHASSIS, a.MARQUE, a.MODELE, a.FINITION,
    b.CMD_Vente_Incadea, b.Fact_Av_Incadea,
    a.DATE_FIN_OF, DATEDIFF(DAY, a.DATE_FIN_OF, GETDATE()) as Age   
from
    [DashboardPowerBi].[dbo].[BI_SVC_PROD_FIN_OF] as a
join 
    BI_SVC_INCADEA_STOCK_VN as b on a.NUM_CHASSIS = b.VIN
where 
    b.CMD_Vente_Incadea = 0 
    and b.Fact_Av_Incadea = 1

You could add the expression to your WHERE : 您可以将表达式添加到WHERE

SELECT PF.NUM_CHASSIS,
       PF.MARQUE,
       PF.MODELE,
       PF.FINITION,
       ISV.CMD_Vente_Incadea,
       ISV.Fact_Av_Incadea,
       PF.DATE_FIN_OF,
       DATEDIFF(DAY, PF.DATE_FIN_OF, GETDATE()) AS Age
FROM [DashboardPowerBi].[dbo].[BI_SVC_PROD_FIN_OF] AS PF
     JOIN BI_SVC_INCADEA_STOCK_VN AS ISV ON PF.NUM_CHASSIS = ISV.VIN
WHERE ISV.CMD_Vente_Incadea = 0
  AND ISV.Fact_Av_Incadea = 1
  AND DATEDIFF(DAY, PF.DATE_FIN_OF, GETDATE()) > 120;

Or use a CTE/Subquery: 或使用CTE /子查询:

WITH CTE AS(
    SELECT PF.NUM_CHASSIS,
           PF.MARQUE,
           PF.MODELE,
           PF.FINITION,
           ISV.CMD_Vente_Incadea,
           ISV.Fact_Av_Incadea,
           PF.DATE_FIN_OF,
           DATEDIFF(DAY, PF.DATE_FIN_OF, GETDATE()) AS Age
    FROM [DashboardPowerBi].[dbo].[BI_SVC_PROD_FIN_OF] AS PF
         JOIN BI_SVC_INCADEA_STOCK_VN AS ISV ON PF.NUM_CHASSIS = ISV.VIN
    WHERE ISV.CMD_Vente_Incadea = 0
      AND ISV.Fact_Av_Incadea = 1)
SELECT *
FROM CTE
WHERE CTE.Age > 120;

Also, note I changed your aliases to something more relevant. 另外,请注意,我将您的别名更改为更相关的名称。 Using aliases that represent the object's name is really important as it makes your code much more readable. 使用代表对象名称的别名非常重要,因为这会使您的代码更具可读性。 Aaron Bertrand did a great article on the subject: Bad habits to kick : using table aliases like (a, b, c) or (t1, t2, t3) . 亚伦·贝特朗(Aaron Bertrand)在以下主题上写了一篇很棒的文章: 不良习惯:使用(a,b,c)或(t1,t2,t3)之类的表别名

cross apply is a convenience in this circumstance: 在这种情况下cross apply是一种方便:

select bfo.NUM_CHASSIS, bfo.MARQUE, bfo.MODELE, bfo.FINITION,
       s.CMD_Vente_Incadea, s.Fact_Av_Incadea, bfo.DATE_FIN_OF,
       v.Age
from [DashboardPowerBi].[dbo].[BI_SVC_PROD_FIN_OF] bfo join
     BI_SVC_INCADEA_STOCK_VN s
     on bfo.NUM_CHASSIS = s.VIN cross apply
     (values (DATEDIFF(DAY, bfo.DATE_FIN_OF, GETDATE())) v(age)
where s.CMD_Vente_Incadea = 0 and s.Fact_Av_Incadea = 1 and
      v.age > 120;

Notice that I also changed the table aliases so your query is easier to follow. 注意,我还更改了表别名,因此您的查询更易于遵循。

  select a.NUM_CHASSIS,a.MARQUE,a.MODELE,a.FINITION,b.CMD_Vente_Incadea,b.Fact_Av_Incadea,a.DATE_FIN_OF ,DATEDIFF(DAY, a.DATE_FIN_OF, GETDATE()) as Age    from [DashboardPowerBi].[dbo].[BI_SVC_PROD_FIN_OF] as a
      join BI_SVC_INCADEA_STOCK_VN as b 
      on a.NUM_CHASSIS = b.VIN
      where b.CMD_Vente_Incadea = 0 and b.Fact_Av_Incadea =1 AND DATEDIFF(DAY, a.DATE_FIN_OF, GETDATE())>120

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM