【问题标题】:how to select columns from same table with different where clause criteria如何从具有不同where子句条件的同一个表中选择列
【发布时间】:2015-06-12 07:10:39
【问题描述】:

我有一个类似于下面设计的表格:

Id   Code     Name    short name     Date1       date2       market
1    12A      AAAA1    a1            2012-03-27  2012-03-27  90
2    13A      AAAA2    a2            2012-03-28  2012-03-28  90
3    14A      AAAA3    a3            NULL        NULL        32
4    15A      AAAA4    a4            NULL        NULL        32

我必须构建一个查询,这样当我选择一个代码时,市场 90 的代码,选择应该是这样一种方式,即 Date1>system date and Date2> Date1 而对于其他市场,没有标准适用于选择.

到目前为止我已经构建了查询,但是当市场为 90 时,我不知道如何指定 where 子句。

SELECT A.Id, B.Name [Name], B.Code [Code], Date1 [Date1], Date2 [Date]2, C.Code[Market]
FROM dbo.fn_idlisting(@System_Date) A 
INNER JOIN code B ON A.Id = B.Id 
LEFT OUTER JOIN Market C ON B.Market_Id = C.Market_Id 
WHERE (Date1 <= @systemDate) AND (Date2 >= Date1)

我觉得如何在没有任何where子句的情况下选择带有market 32​​的其他代码。

【问题讨论】:

  • 您能否添加更多详细信息:了解有关 fn_listing 和 Market 的更多信息可能会很有用。顺便说一句,where 子句没有指定涉及哪些表...
  • 这个是mysql还是sql server?
  • 微软 SQL Server 或 MySQL,好吗?
  • 这很明显是 sql-server。方括号和dbo. 倾向于放弃它。
  • 它的Microsoft sql server,fn_listing会列出系统日期在创建日期和到期日期之间的所有代码。 market 包含市场 id 的市场代码

标签: sql-server


【解决方案1】:

你可以试试这个方法

SELECT A.Id, B.Name [Name], B.Code [Code], Date1 [Date1], Date2 [Date]2, C.Code[Market] 
    FROM dbo.fn_idlisting(@System_Date) A 
    INNER JOIN code B ON A.Id = B.Id
    LEFT OUTER JOIN Market C ON B.Market_Id = C.Market_Id 
    WHERE (Date1 > @System_Date and Date2 >Date1 or c.Code != 90)

【讨论】:

    【解决方案2】:

    使用CASE 语句包含您的Market = 90 逻辑,如下所示:

    SELECT
      A.Id,
      B.Name [Name],
      B.Code [Code],
      Date1 [Date1],
      Date2 [Date2],
      C.Code [Market]
    FROM
      dbo.fn_idlisting(@System_Date) A
      INNER JOIN code B
        ON A.Id = B.Id
      LEFT OUTER JOIN Market C
        ON B.Market_Id = C.Market_Id
    WHERE
      Date1 <= CASE WHEN C.Code = 90 THEN @systemDate ELSE Date1 END 
      AND 
      Date2 >= CASE WHEN C.Code = 90 THEN Date1 ELSE Date2 END
    

    【讨论】:

      【解决方案3】:

      我从您的问题中了解到您的表名是 fn_idlisting 并且您只有一张表。试试下面。

      注意:我没有使用等于,因为你只提到>和

      select * from fn_idlisting 
      where market=90 and date1>cast(SYSDATETIME() as DATE)
      and date2>date1
      union
      select * from fn_idlisting 
      where market<>90
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-31
        • 2015-02-28
        • 2014-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多