Как использовать новый вывод в предложении where в SQL Server - PullRequest
0 голосов
/ 16 апреля 2019

Я выполняю этот запрос и хочу добавить where Age > 120, но, поскольку Age не является столбцом, я не смог этого сделать.

Можете ли вы помочь мне сделать это

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

Ответы [ 3 ]

3 голосов
/ 16 апреля 2019

Вы можете добавить выражение к вашему 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;

Или используйте 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;

Также обратите внимание, что я изменил ваши псевдонимы на что-то более актуальное. Использование псевдонимов, представляющих имя объекта, действительно важно, так как это делает ваш код намного более читабельным. Аарон Бертран сделал отличную статью на эту тему: Вредные привычки: использовать псевдонимы таблиц, такие как (a, b, c) или (t1, t2, t3) .

2 голосов
/ 16 апреля 2019

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;

Обратите внимание, что я также изменил псевдонимы таблиц, чтобы вашему запросу было легче следовать.

1 голос
/ 16 апреля 2019
  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...