Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL解决方案?_Sql_Sql Server - Fatal编程技术网

SQL解决方案?

SQL解决方案?,sql,sql-server,Sql,Sql Server,汽车表汽车识别号,客户识别号,型号,交货日期,注册号 101 1 Yaris - Active 05-Jan-2016 aa-168 102 1 Yaris 06-Jan-2017 ab-168 103 2 Fortuner 07-Jan-2017 aa-1111 104 3 Vios 08-Jan-2017 aa-1234 105 3 A

汽车表汽车识别号,客户识别号,型号,交货日期,注册号

      101   1   Yaris - Active  05-Jan-2016 aa-168
      102   1   Yaris           06-Jan-2017 ab-168
      103   2   Fortuner        07-Jan-2017 aa-1111
      104   3   Vios            08-Jan-2017 aa-1234
      105   3   Altis           09-Feb-2017 ab-5555
      106   4   Camry           10-Feb-2016 ab-9999
      107   5   Hilux Revo      11-Feb-2017 aa-6666
服务表车号、服务日期、服务金额、服务详情

      101   05-Feb-2016 2565    1000km
      101   10-Aug-2016 3400    10000km
      101   20-Feb-2016 2100    20000km
      102   06-Feb-2017 2565    1000km
      103   07-May-2017 3400    10000km
      104   08-Feb-2017 2565    1000km
      105   09-May-2017 2565    1000km
      106   10-Mar-2016 2565    1000km
      106   15-Aug-2016 3400    10000km
      106   20-Dec-2016 2100    20000km
我的目标是从两个表中查询值,以便显示

预定表格型号、注册号、上次服务、上次服务

              Yaris-Active aa-168 20-Feb-2016 10-Aug-2016
              Yaris        ab-168 06-Feb-2017 -
              .............................................
              Camry        aa-9999 20-Dec-2016 15-Aug-2016
正如您所看到的,最后一次维修将包含汽车使用该服务的最后日期,而上一次维修将包含汽车在维修之前使用该服务的日期。我的基本步骤是使用左连接之间的汽车和服务表,因为它是倾斜向汽车表

我的目标步骤是查询Car\u id和CountCar\u id,并按Car\u id分组,因为它将指示该车的存在编号。之后,使用计数数字来指示该模型的最后一行和最后第二行,并将值指定给指定的列…但是,我必须将其转换为SQL

 SELECT Model, Reg_No, Service_Date As Last_Service, Service_Date As Previous_Date
  FROM Car LEFT JOIN Service ON Car.Car_id = Service.Car_id

   SELECT Car_id, Count(Car_id) As No.Times
   From Service
   Group BY Car_id

我需要帮助…

请在第一次选择之前先选择:

WITH countedservices AS(
  SELECT *, ROW_NUMBER() OVER(PARTITION BY car_id ORDER BY service_date DESC) service_num
  FROM service
)
现在,您可以将countedservices连接到car表两次—一次使用service_num=1,一次使用service_num=2,分别访问当前和以前的服务数据

如果您使用的是左连接,不要在WHERE子句中强制使用这些谓词,这可能是因为某些汽车无法维修,因为它会将左连接转换为内部连接。将它们放在ON子句中:

SELECT * 
FROM 
  car c
  LEFT JOIN countedservice cur ON ... AND cur.service_num = 1
  LEFT JOIN countedservice prev ON ... AND prev.service_num = 2

将此项放在第一次选择之前:

WITH countedservices AS(
  SELECT *, ROW_NUMBER() OVER(PARTITION BY car_id ORDER BY service_date DESC) service_num
  FROM service
)
现在,您可以将countedservices连接到car表两次—一次使用service_num=1,一次使用service_num=2,分别访问当前和以前的服务数据

如果您使用的是左连接,不要在WHERE子句中强制使用这些谓词,这可能是因为某些汽车无法维修,因为它会将左连接转换为内部连接。将它们放在ON子句中:

SELECT * 
FROM 
  car c
  LEFT JOIN countedservice cur ON ... AND cur.service_num = 1
  LEFT JOIN countedservice prev ON ... AND prev.service_num = 2
使用row_number根据车辆id获取服务日期序列,然后加入下一个序列

select t1.Car_id, t1.Model, t1.Reg_No, t2.Service_Date as Last_Service, t1.Service_Date as Previous_Date
from 
    (select Car_id, Model, Reg_No, row_number() over (partition by Car_id order by s.Service_Date asc) rn, s.Service_Date
        from Car c
        inner join Service s on s.Car_id = s.Car_id) as t1
left join
    (select Car_id, Model, Reg_No, row_number() over (partition by Car_id order by Service_Date asc) rn, s.Service_Date
        from Car c
        inner join Service s on s.Car_id = s.Car_id) as t2 on t2.Car_id = t1.Car_id and t2.rn + 1 = t1.rn
使用row_number根据车辆id获取服务日期序列,然后加入下一个序列

select t1.Car_id, t1.Model, t1.Reg_No, t2.Service_Date as Last_Service, t1.Service_Date as Previous_Date
from 
    (select Car_id, Model, Reg_No, row_number() over (partition by Car_id order by s.Service_Date asc) rn, s.Service_Date
        from Car c
        inner join Service s on s.Car_id = s.Car_id) as t1
left join
    (select Car_id, Model, Reg_No, row_number() over (partition by Car_id order by Service_Date asc) rn, s.Service_Date
        from Car c
        inner join Service s on s.Car_id = s.Car_id) as t2 on t2.Car_id = t1.Car_id and t2.rn + 1 = t1.rn
像这样试试

 SELECT    Model,
            Reg_No,
            Service_Date
  INTO      #Temp_Output_1
  FROM      Temp_Car        Car
  JOIN      Temp_Service    Servic
    ON  (Car.Car_id =   Servic.Car_id)

  SELECT    Model,
            Reg_No,
            Service_Date,
            (SELECT MAX(Service_Date) FROM #Temp_Output_1 T1 WHERE T1.Reg_No = T2.Reg_No AND T1.Service_Date < T2.Service_Date)  AS Prev_Service_Date
  FROM      #Temp_Output_1 T2
  WHERE     T2.Service_Date =   (
                                    SELECT  MAX(Service_Date)
                                    FROM    #Temp_Output_1 T3
                                    WHERE   T2.Reg_No   =   T3.Reg_No
                                )
像这样试试

 SELECT    Model,
            Reg_No,
            Service_Date
  INTO      #Temp_Output_1
  FROM      Temp_Car        Car
  JOIN      Temp_Service    Servic
    ON  (Car.Car_id =   Servic.Car_id)

  SELECT    Model,
            Reg_No,
            Service_Date,
            (SELECT MAX(Service_Date) FROM #Temp_Output_1 T1 WHERE T1.Reg_No = T2.Reg_No AND T1.Service_Date < T2.Service_Date)  AS Prev_Service_Date
  FROM      #Temp_Output_1 T2
  WHERE     T2.Service_Date =   (
                                    SELECT  MAX(Service_Date)
                                    FROM    #Temp_Output_1 T3
                                    WHERE   T2.Reg_No   =   T3.Reg_No
                                )

您可以使用LEAD、LAG功能查找上一次保养、上一次保养我理解的要求是,他每辆车只需要一条记录,包括当前保养和上一次保养。虽然可以使用滞后/超前来实现这一点,但将行数限制为1是很麻烦的。rownumber更容易使用,这样你就可以指出你想要从哪一行获取所有数据,即使你延迟了,你也可能最终使用了rownumber。你可以使用LEAD,lag函数来查找最后一次维修,以前的维修。我理解的要求是,他每辆车只需要一条记录,包括当前和以前的记录。虽然可以使用滞后/超前来实现这一点,但将行数限制为1是很麻烦的。rownumber更易于使用,这样您就可以指示所有数据来自哪一行,即使您延迟,您也可能最终使用rownumber。您的解决方案是好的,但每个模式只有一行,并且您的查询返回同一模型的多行,这是错误的。这样使用。。选择型号、注册号、服务日期、,从临时输出中选择MAXService\u日期,其中T1.Reg\u No=T2.Reg\u No;从临时输出中选择MAXService\u日期,其中T2.Reg\u No=T3.Reg\u No;从临时输出中选择MAXService\u日期,其中T1.Service\u Date