SQL服务器查询,select首日存货充足

SQL server query, select first date where enough stock

我有一个这样的 table :

id  Date                    Qty
1   Feb 25 2015 12:00AM      34
2   Feb 27 2015 12:00AM      34
3   Mar 17 2015 12:00AM      153
4   Mar 27 2015 12:00AM      68
5   Apr  3 2015 12:00AM      153
6   May  6 2015 12:00AM      153

我想要 select 有足够数量满足我需要的第一个日期。 我提出的这个请求适用于大多数情况,但当我需要 210 时不适用于此数据。它应该 select 我 3 月 17 日,但我有 2 月 27 日

SELECT top 1
T1.Date,
T1.Qty
,SUM(cast (T2.Qty as int)) AS cumulqte
FROM
  ##temptest3 T1
    INNER JOIN ##temptest3 T2
        ON T1.Date >= T2.Date
GROUP BY T1.id, T1.Date, T1.Qty
HAVING SUM(cast (T2.Qty as int)) >=210
ORDER BY T1.Date;

我已经尝试更改很多东西的顺序,但没有任何效果。

编辑: 这是我创建 table 的方式:

select * into ##temptest1 from sysadm.fnSplitString('17223ü17225ü17243ü17253ü17260ü17293','ü')
update ##temptest1 set splitdata=DATEADD(day,cast(splitdata as int), '1967-12-31');

select * into ##temptest2 from sysadm.fnSplitString('34ü34ü153ü68ü153ü153','ü')
update ##temptest2 set splitdata='0' where splitdata=''

create table ##temptest3 (id int,Date nvarchar(max), Qte NVARCHAR(MAX) )
INSERT INTO ##temptest3 (id, Qte, Date) select ##temptest2.id, ##temptest2.splitdata, ##temptest1.splitdata from ##temptest2 inner join ##temptest1 on ##temptest2.id=##temptest1.id

试试这个:

DECLARE @TEMP_COMMUNICATION_TABLE TABLE (ID INT IDENTITY(1,1), [DATE] DATETIME, QTY INT)
INSERT INTO @TEMP_COMMUNICATION_TABLE VALUES ('2015-02-27',34),('2015-02-25',34),('2015-03-17',153),('2015-03-27',68),('2015-04-03',153),('2015-05-06',153)

--SELECT * FROM @TEMP_COMMUNICATION_TABLE
DECLARE @INPUT INT = 210

SELECT TOP 1
    T1.Date,
    T1.Qty,
    SUM(T2.QTY)
FROM @TEMP_COMMUNICATION_TABLE T1
INNER JOIN @TEMP_COMMUNICATION_TABLE  T2
    ON T1.DATE >= T2.DATE
GROUP BY
    T1.Date,
    T1.Qty
HAVING SUM(cast (T2.Qty as int)) >=@INPUT
--ORDER BY T1.Date;

您的查询是完美的,删除订单。

正如我在评论中所说,您需要将日期字段转换/转换为日期或日期时间,以便订单正常工作:

SELECT top 1
T1.Date,
T1.Qty
,SUM(cast (T2.Qty as int)) AS cumulqte
FROM
  ##temptest3 T1
    INNER JOIN ##temptest3 T2
        ON T1.Date >= T2.Date
GROUP BY T1.id, T1.Date, T1.Qty
HAVING SUM(cast (T2.Qty as int)) >=210
ORDER BY Cast(T1.Date as datetime)

问题是,当您创建 ##temp 表时,您使用的是 nvarchar 类型而不是 datetime(并且 int 用于数量)。最好的补救方法是在创建表时使用正确的类型,如果这不起作用,您可以像这样在查询中使用强制转换:

SELECT top 1
cast(t1.Date as  datetime),
T1.Qty
,SUM(cast (T2.Qty as int)) AS cumulqte
FROM
  ##temptest3 T1
    INNER JOIN ##temptest3 T2
        ON cast(t1.Date as  datetime) >= cast(t2.Date as  datetime)
GROUP BY T1.id, cast(t1.Date as  datetime), T1.Qty
HAVING SUM(cast (T2.Qty as int)) >=210
ORDER BY cast(t1.Date as  datetime);

看到这个SQL Fiddle