Tengo una mesa como esta:

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

Quiero seleccionar la primera fecha en la que tendré suficiente cantidad para mi necesidad. Hice esta solicitud que funciona para la mayoría de los casos, pero no en estos datos cuando necesito 210. Debería seleccionarme el 17 de marzo, pero tengo el 27 de febrero.

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;

He intentado cambiar el orden y muchas cosas, pero nada funciona.

Editar: esta es la forma en que creo mi tabla:

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
0
Etienne 6 feb. 2015 a las 13:12

3 respuestas

La mejor respuesta

El problema es que cuando crea sus ## tablas temporales, está utilizando el tipo nvarchar en lugar de datetime (y ​​int para la cantidad). El mejor remedio sería usar los tipos correctos al crear las tablas, si eso no funciona, puede usar conversiones en la consulta como esta:

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);

Vea este SQL Fiddle

1
jpw 6 feb. 2015 a las 10:43

Prueba esto:

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;

Tu consulta es perfecta, elimina el pedido por.

0
Immu 6 feb. 2015 a las 10:32

Como dije en mi comentario, debe emitir / convertir su campo Fecha a una fecha o fecha y hora para que el pedido funcione correctamente:

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)
1
Christian Barron 6 feb. 2015 a las 10:41