2016-11-23 53 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

不明白德第一選項,但第二個工作,謝謝! –