简体   繁体   English

SQL Server 2008如何执行此查询的子查询

[英]SQL Server 2008 how can I do a subquery of this query

I have the following query 我有以下查询

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

But for some reason it doesn't work as expected, for some reason, it is returning 但是由于某种原因,它无法按预期工作,由于某种原因,它正在返回

    +------------+-------------+-----------------+----------+---------+------------------+-------------------------+-------------------------+---------------------------------------------------+-------------------------+
|  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 |
+------------+-------------+-----------------+----------+---------+------------------+-------------------------+-------------------------+---------------------------------------------------+-------------------------+

but it really should be returning 1 row 但它确实应该返回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 |

My guess it is because both columns (F_entrada and F_Salida), so I decided to "join" them on the column Fecha (the last one), and now I want to filter the data by the column "Fecha", but I don't know how to do it. 我的猜测是,因为这两个列(F_entrada和F_Salida),所以我决定将它们“联接”到Fecha列(最后一个)上,现在我想通过“ Fecha”列过滤数据,但是我不这样做。不知道该怎么做。

Thank you for your help. 谢谢您的帮助。

You have 2 options here: 您在这里有2个选项:

  1. Add the (CASE WHEN... ) statement to the where clause like this 像这样将(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. Wrap your existing select statement as a sub-query that calculates the fecha then you can use fecha in the outer query. 将现有的select语句包装为计算fecha的子查询,然后可以在外部查询中使用fecha。 like this 像这样

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM