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
我有一个这样的 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