用于调用具有条件的多列的sql查询(使用nas)

tzcvj98z  于 2021-06-24  发布在  Mysql
关注(0)|答案(3)|浏览(379)

这是我上一个问题的连续问题。我想编写一个sql查询,调用几个带条件的列。我正在使用rmysql包开发r studio。我的服务器是mysql。
这张table看起来像这样。

  1. organisation A B C D
  2. Ikea 2018-04-01 2018-05-07 2018-05-09 2018-05-01
  3. Ikea 2018-06-01 2018-05-03 2018-05-29 NA
  4. Orange 2018-04-02 2018-05-01 2018-07-08 2018-05-26
  5. Ikea 2018-06-02 2018-05-01 NA 2018-05-26
  6. Nestle 2018-06-02 2018-05-01 NA 2018-05-26
  7. Ikea NA 2018-05-05 2018-04-02 2018-06-01

我想得到一行,组织机构是宜家,四列(a,b,c,d)中最早的日期是2018-05-01和2018-05-31。
在包含na值的行中,我想忽略nas,看看其余值中最早的日期是什么。例如,对于第二行,最早的日期是“2018-05-03”(b列),因此它符合标准。
因此,只有上面原始表的第二行和第四行符合条件。我想得到的结果应该是:

  1. organisation A B C D
  2. Ikea 2018-06-01 2018-05-03 2018-05-29 NA
  3. Ikea 2018-06-02 2018-05-01 NA 2018-05-26

如何编写sql查询?这是我在得到上一个问题的答案后的尝试,但对于使用nas的行来说效果不好。

  1. SELECT * FROM myTable
  2. WHERE organisation LIKE Ikea
  3. LEAST(A, B, C, D) >= '2018-05-01' AND
  4. LEAST(A, B, C, D) < '2018-06-01'

谢谢你的帮助!

xlpyo6sf

xlpyo6sf1#

考虑在使用 UNION ALL :

  1. SELECT m.*
  2. FROM myTable m
  3. INNER JOIN
  4. (SELECT t.ID, MIN(t.`DateValue`) As MinDate
  5. FROM
  6. (SELECT ID, organisation, 'A' As 'Category', A As `DateValue` FROM myTable
  7. UNION ALL
  8. SELECT ID, organisation, 'B' As 'Category', B As `DateValue` FROM myTable
  9. UNION ALL
  10. SELECT ID, organisation, 'C' As 'Category', C As `DateValue` FROM myTable
  11. UNION ALL
  12. SELECT ID, organisation, 'D' As 'Category', D As `DateValue` FROM myTable) As t
  13. WHERE t.organisation = 'Ikea'
  14. GROUP BY t.ID
  15. HAVING MIN(t.`DateValue`) >= '2018-05-01' AND MIN(t.`DateValue`) < '2018-06-01') As agg
  16. ON m.ID = agg.ID;

rextester演示(注:日期为dd-mm-yyyy格式)

展开查看全部
5lhxktic

5lhxktic2#

你可以试着用 IFNULL() 价值和用途 getdate() 所以如果它是空的,它只会在今天使用,然后就不会被认为是最基本的忽略它们。
比如: LEAST(IFNULL(A,getdate()), IFNULL(B,getdate()), IFNULL(C,getdate()), IFNULL(D,getdate())) 希望这能把你推向正确的方向
除非 NA 其中有一个字符串,可以使用case语句 case when A = 'NA' THEN getdate() end 可能最后看起来像

  1. SELECT * FROM myTable
  2. WHERE organisation LIKE Ikea
  3. LEAST(IFNULL(A,getdate()), IFNULL(B,getdate()), IFNULL(C,getdate()), IFNULL(D,getdate())) >= '2018-05-01' AND
  4. LEAST(IFNULL(A,getdate()), IFNULL(B,getdate()), IFNULL(C,getdate()), IFNULL(D,getdate())) < '2018-06-01'

  1. SELECT * FROM myTable
  2. WHERE organisation LIKE Ikea
  3. LEAST(case when A = 'NA' THEN getdate() else A end, case when B = 'NA' THEN getdate() else B end, case when C = 'NA' THEN getdate() else C end, case when D = 'NA' THEN getdate() else D end) >= '2018-05-01' AND
  4. LEAST(case when A = 'NA' THEN getdate() else A end, case when B = 'NA' THEN getdate() else B end, case when C = 'NA' THEN getdate() else C end, case when D = 'NA' THEN getdate() else D end) < '2018-06-01'
wfypjpf4

wfypjpf43#

只是使用 coalesce() :

  1. SELECT *
  2. FROM myTable
  3. WHERE organisation LIKE 'Ikea' AND
  4. LEAST(COALESCE(A, '2019-01-01'), COALESCE(B, '2019-01-01'), COALESCE(C, '2019-01-01'), COALESCE(D, '2019-01-01')) >= '2018-05-01' AND
  5. LEAST(COALESCE(A, '2019-01-01'), COALESCE(B, '2019-01-01'), COALESCE(C, '2019-01-01'), COALESCE(D, '2019-01-01')) < '2018-06-01';
  6. ``` `'2019-01-01'` 是范围之后的任意日期。

相关问题