【问题标题】:Need Duplicate Entries for Each Day For a Date Range in MS SQL QueryMS SQL 查询中的日期范围每天需要重复条目
【发布时间】:2017-10-16 11:54:05
【问题描述】:

*********场景**************

我有公共汽车运营,其中一些公共汽车一天加注燃料不止一次,假设一辆公共汽车 (4345) 在 2017 年 4 月 9 日加注一次燃料,在 2017 年 3 月 9 日加注两次燃料.

我有查询从某个日期(DateFrom 和 DateTo)开始运行,并获取每辆车的燃料条目,这些条目在这个选定的日期范围内不止一个......但我需要什么 结果来自特定日期范围 (DateFrom -- DateTo) 和在此 caretaria 下每辆车的每个日期车辆填充燃料的次数..为了更好地理解,您可以查看随附的图像.... 我正在使用的查询如下:

WITH Records_counts AS 
    (
        SELECT f.*, COUNT(*) OVER (PARTITION BY bus1) ct
        FROM  Fuel.vFuelEntriesDetails f                
  )
    SELECT * FROM Records_counts WHERE  ct > 1  
    AND FuelEntryDate >='2017-09-03' and FuelEntryDate <'2017-09-05' 
        AND  ( BusNo BETWEEN '10161/1' AND  '10180/1' ) 
ORDER BY BusNo DESC

【问题讨论】:

  • 编辑您的问题并在您的问题中以文本形式提供示例数据和所需结果。

标签: sql sql-server tsql


【解决方案1】:

正如@Gordon Linoff 所说,请提供示例数据以便清楚地理解预期的输出。

根据我的理解,我为示例演示创建了下表:

表:

create table tbl_vehicle
(
   busno varchar(10),
   plateno int,
   coldate date
);

记录:

insert into tbl_vehicle values('1016/1',4345,'2017-09-03'),('1016/1',4345,'2017-09-03'),
('1016/1',4345,'2017-09-03'),('1016/1',4345,'2017-09-04');

查询:

SELECT plateno,coldate,COUNT(*) as fuel_fill_count 
FROM tbl_vehicle
WHERE coldate BETWEEN '2017-09-03' and '2017-09-05' 
      and busno BETWEEN '1016/1' AND  '10180/1'
GROUP BY plateno,coldate 

输出:

plateno coldate     fuel_fill_count
------------------------------------
4345    2017-09-03  3
4345    2017-09-04  1

注意:在 SQL Server 2008 R2 上测试。

【讨论】:

    【解决方案2】:

    你可以试试这个。

    ;WITH Records_counts AS 
    (
        SELECT f.*, COUNT(*) OVER (PARTITION BY FuelEntryDate, BusNo) ct
        FROM  Fuel.vFuelEntriesDetails f
    )
    SELECT * FROM Records_counts WHERE  
        FuelEntryDate >='2017-09-03' and FuelEntryDate <'2017-09-05' 
            AND  ( BusNo BETWEEN '10161/1' AND  '10180/1' ) 
    ORDER BY BusNo DESC
    

    【讨论】:

      【解决方案3】:

      @sarslan....对不起,这个查询下的结果是错误的....你发布的。

      【讨论】:

        【解决方案4】:

        您不需要 cte,只需将日期添加到您的分区 由于您的 FuelEntryDate 是日期时间,因此您只需要使用日期部分

        SELECT DATE(FuelEntryDate) EntryDate, f.*, COUNT(*) OVER (PARTITION BY Busno, Date(FuelEntryDate)) ct
        FROM  Fuel.vFuelEntriesDetails f
        WHERE  
            FuelEntryDate BETWEEN '2017-09-03' AND FuelEntryDate '2017-09-05' 
            AND  ( BusNo BETWEEN '10161/1' AND  '10180/1' ) 
        ORDER BY BusNo, FuelEntryDate
        

        【讨论】:

          【解决方案5】:

          @Gordon Linoff ............请检查这些 cmets 的图像和我发布的 cmets 上方的表结构图像,还阅读了每个图像上的 cmets......

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-03-28
            • 2014-11-01
            • 2010-10-16
            相关资源
            最近更新 更多