【问题标题】:SQL QUERY - using range of values with <= operatorSQL QUERY - 使用带有 <= 运算符的值范围
【发布时间】:2016-04-29 16:27:04
【问题描述】:

我是 sql 新手,我需要您在以下方面的帮助。非常感谢您抽出宝贵时间!

Locprog 表列出了在各个位置启动程序的日期(每个位置由唯一的 LOC 指示符标识)

LOC PROG DATE_STARTED   
121   P     10-JUL-95
131   P     11-JUL-95
141   P     18-APR-00
151   P     19-APR-00
161   P     26-MAY-06
171   P     28-MAY-06
181   P     30-APR-15
191   P     31-APR-15
192   P     19-JAN-16
195   P     20-JAN-16

DTWK 表给出了与特定日期相关的周数

D_IND       W_IND
09-JUL-95   199501
10-JUL-95   199502
11-JUL-95   199502
12-JUL-95   199502
13-JUL-95   199502
14-JUL-95   199502
15-JUL-95   199502
16-JUL-95   199502
17-JUL-95   199502
...        ...
18-APR-00   200005
19-APR-00   200005
26-MAY-06   200602
28-MAY-06   200602
30-APR-15   201504
31-APR-15   201504
19-JAN-16   201603
20-JAN-16   201603

问题:我想查找在 200602 周和 201603 周之间该计划处于活动状态的位置数量

我试过了

 select count(*) from (
 select distinct A.LOC, A.Date_started, B.w_ind as wk from Locprog A, DTWK B 
 where a.date_started=B.d_ind) aa
 where aa.wk<=200602

答案:6

我在尝试在

 select count(*), bb.wek from (
  select distinct A.LOC, A.Date_started, B.w_ind as wk from Locprog A, DTWK B 
  where a.date_started=B.d_ind) aa
  where aa.wk<= ( select distinct W_ind as wek fromDTWK where W_ind between 200602 and 201603) bb
   group by bb.wk
   order by bb.wk

查询不起作用。你能帮忙吗?谢谢!

想要的输出

 wk       count
 200602    6
 201504    8    
 201603   10

【问题讨论】:

  • 尝试:SELECT COUNT(LOC) FROM LOCPROG WHERE DATE_STARTED IN (SELECT D_IND FROM DTWK WHERE W_IND BETWEEN 200602 AND 201603) GROUP BY LOC;
  • 为什么不只是WHERE aa.wk BETWEEN 200602 AND 201603?
  • 根据您的样本数据将是所需的输出吗?
  • 不清楚为什么要使用像&lt;= 这样的比较运算符和子查询返回的周数列表。它应该小于多少?
  • 是mysql还是oracle?你们都标记了

标签: mysql sql sql-server database oracle


【解决方案1】:

DTWK 表有许多记录每个星期的编号。
以下查询给出了每个星期数的开始和结束日期:

SELECT min( D_IND ) start_date,
       max( D_IND ) end_date
FROM DTWK d
WHERE d.W_IND between 200602 and 201603
GROUP BY W_IND

并且这个查询的结果可以连接到 LOC 表来计算一个计数:

SELECT count( distinct loc )
FROM LOC l
JOIN (
    SELECT min( D_IND ) start_date,
           max( D_IND ) end_date
    FROM DTWK d
    WHERE d.W_IND between 200602 and 201603
    GROUP BY W_IND
) x
ON l.date_started between x.start_date and x.end_date
;

演示:http://sqlfiddle.com/#!15/a08af/6

【讨论】:

  • dtwk 似乎不一致。比较 199502 和 2016*。我的第一个假设是一周中每天有一个条目,但我不知道。
  • @David Bachmann Jeppesen 非常感谢您指出 - 我错过了每周有很多日期。我更改了答案,但查询保持不变 - 它应该适用于两种情况。
  • 任何时候 - 虽然我删除了我的评论,因为我自己错过了一个细节。只有当您确信 DTWK 表包含所有日期或它包含 LogProg 表中的所有日期时,您的答案仍然有效,在这两种情况下,我的答案也适用。如果不能保证这会变得有点复杂......
  • 谢谢@Kordirko!对您的答案稍作修改后,我得到了所需的结果
  • 感谢@David 的cmets 和时间
【解决方案2】:
SELECT COUNT(DISTINCT lp.loc)
FROM LogProg lp JOIN DTWK dw on lp.date_started = dw.d_ind
WHERE dw.w_ind >= 200602
AND dw.w_ind <= 201603;

【讨论】:

  • 我想你的意思是&lt;= 201603。或者只使用between。虽然这不起作用,因为您必须等于开始日期,但您可能希望它是之后的任何日期。
  • 谢谢唐尼 - 修复它! :)
  • 查看我的编辑。假设我正在正确阅读他的表结构,遇到了另一个问题。
  • 顺便说一句 - 我不了解 MySql,但使用 Oracle,您总是可以从日期中获取周数。您可以在 SO 上轻松了解如何操作。
  • Donnie - 你能描述一下你发现了什么问题吗?
猜你喜欢
  • 2010-09-09
  • 2016-07-05
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 2016-08-11
相关资源
最近更新 更多