2016-11-23 112 views
0

我有以下查询SQL Server 2008中我怎么能做到这一点查询的子查询

select 
    coalesce(NULLIF(No_Parte,' '), NULLIF(OEM,' '), Num_serie) as Producto, 
    Id_Sucursal, Tipo_Movimiento, Cantidad, Costo,No_Servicio, 
    F_Entrada, F_Salida, Observaciones, 
    (case 
     when F_Entrada > F_Salida 
      then F_Entrada 
      else F_Salida 
    end) as Fecha 
from 
    Kardex_Producto 
where 
    Id_Sucursal = 'tehuacan' 
    and ((F_Entrada >= CONVERT(DateTime, '20161031', 103) OR F_Salida >= CONVERT(DateTime, '20161031', 103)) 
    and (F_Entrada <= CONVERT(DateTime, '20161031', 103) OR F_Salida <= CONVERT(DateTime, '20161031', 103))) --and Tipo_Movimiento='S-' 
order by 
    Tipo_Movimiento, No_Servicio 

但由于某些原因如预期这是行不通的,因为某些原因,它返回

+------------+-------------+-----------------+----------+---------+------------------+-------------------------+-------------------------+---------------------------------------------------+-------------------------+ 
| Producto | Id_Sucursal | Tipo_Movimiento | Cantidad | Costo | No_Servicio |  F_Entrada  |  F_Salida   |     Observaciones     |   Fecha   | 
+------------+-------------+-----------------+----------+---------+------------------+-------------------------+-------------------------+---------------------------------------------------+-------------------------+ 
| 1TU3CWH | TEHUACAN | E+    | 1.00  |  0 | Traspaso No. 568 | 2016-11-11 19:19:43.447 | 1900-01-01 00:00:00.000 |             | 2016-11-11 19:19:43.447 | 
| 23651  | TEHUACAN | E+    | 1.00  |  0 | Traspaso No. 569 | 2016-11-14 12:29:21.663 | 1900-01-01 00:00:00.000 |             | 2016-11-14 12:29:21.663 | 
| 37035  | TEHUACAN | E+    | 2.00  |  0 | Traspaso No. 569 | 2016-11-14 12:29:20.657 | 1900-01-01 00:00:00.000 |             | 2016-11-14 12:29:20.657 | 
| 39657  | TEHUACAN | E+    | 2.00  |  0 | Traspaso No. 569 | 2016-11-14 12:29:19.403 | 1900-01-01 00:00:00.000 |             | 2016-11-14 12:29:19.403 | 
| 37069  | TEHUACAN | E+    | 6.00  |  0 | Traspaso No. 571 | 2016-11-17 15:29:30.147 | 1900-01-01 00:00:00.000 |             | 2016-11-17 15:29:30.147 | 
| 37282  | TEHUACAN | E+    | 1.00  |  0 | Traspaso No. 571 | 2016-11-17 15:29:29.503 | 1900-01-01 00:00:00.000 |             | 2016-11-17 15:29:29.503 | 
| 37069  | TEHUACAN | S-    | 1.00  |  0 | 0000000002368 | 1900-01-01 00:00:00.000 | 2016-10-31 18:07:05.880 | Venta de Mostrador con numero de ticket indicado. | 2016-10-31 18:07:05.880 | 
| 44259  | TEHUACAN | S-    | 1.00  |  0 | 0000000002369 | 1900-01-01 00:00:00.000 | 2016-11-03 15:59:39.307 | Venta de Mostrador con numero de ticket indicado. | 2016-11-03 15:59:39.307 | 
| 37069  | TEHUACAN | S-    | 1.00  |  0 | 0000000002370 | 1900-01-01 00:00:00.000 | 2016-11-04 11:07:04.713 | Venta de Mostrador con numero de ticket indicado. | 2016-11-04 11:07:04.713 | 
| 39510  | TEHUACAN | S-    | 1.00  |  0 | 0000000002370 | 1900-01-01 00:00:00.000 | 2016-11-04 11:07:05.553 | Venta de Mostrador con numero de ticket indicado. | 2016-11-04 11:07:05.553 | 
| 302H493011 | TEHUACAN | S-    | 1.00  |  0 | 0000000002371 | 1900-01-01 00:00:00.000 | 2016-11-04 20:07:17.730 | Venta de Mostrador con numero de ticket indicado. | 2016-11-04 20:07:17.730 | 
+------------+-------------+-----------------+----------+---------+------------------+-------------------------+-------------------------+---------------------------------------------------+-------------------------+ 

但它确实应该返回1行

| 37069  | TEHUACAN | S-    | 1.00  | 180.00 | 0000000002368 | 1900-01-01 00:00:00.000 | 2016-10-31 18:07:05.880 | Venta de Mostrador con numero de ticket indicado. | 2016-10-31 18:07:05.880 | 

我想这是因为两列(F_entrada和F_Salida),所以我去有助于他们在Fecha栏(最后一栏)“加入”,现在我想通过“Fecha”栏来过滤数据,但我不知道该怎么做。

谢谢你的帮助。

+1

'SELECT * FROM(更改为MyQuery)t'是把东西在一个子查询(虽然你几乎需要拿出'为了by'部分)的基本途径。出于兴趣,是否有任何特定的原因你的where子句看起来像那样?您不需要将“20161031”转换为日期时间... – ZLK

+0

对于您的查询返回预期结果。你的搜索标准是什么?你想实现什么? – ydoow

+0

谢谢你的快速回答! 当我开始改进这个系统时,如果我使用了('yyyyMMdd'),我的查询不起作用,这就是为什么我必须转换。我将删除它并检查它现在是否可用。 再次感谢您的帮助! –

回答

1

你有2个选择这里:

  1. 添加(CASE WHEN...)语句来where条款这样

    WHERE Id_Sucursal='tehuacan' AND (case when F_Entrada>F_Salida then F_Entrada else F_Salida end) <= CONVERT(DateTime, '20161031', 103)

  2. 总结现有的select语句作为一个子查询计算fecha然后你可以在外部查询中使用fecha。这样

SELECT * FROM ( select coalesce(NULLIF(No_Parte,' '), NULLIF(OEM,' '),Num_serie) as Producto, Id_Sucursal, Tipo_Movimiento, Cantidad, Costo,No_Servicio, F_Entrada, F_Salida, Observaciones, (case when F_Entrada>F_Salida then F_Entrada else F_Salida end) as Fecha from Kardex_Producto ) as product WHERE Id_Sucursal='tehuacan' AND Fecha <= CONVERT(DateTime, '20161031', 103) order by Tipo_Movimiento, No_Servicio

+0

不明白德第一选项,但第二个工作,谢谢! –