【问题标题】:Combining multiple sql statements into columns将多个sql语句组合成列
【发布时间】:2014-01-07 21:14:47
【问题描述】:

我对 SQL 很陌生,我正在运行类似的东西来提取一些数据。但目前我一次运行一个语句并将它们复制到 excel 中。有没有办法将所有这些一起运行?每个语句的级别相同,但 count(ID) 会不同。也可能有些日子一个级别没有任何数据。

select 
    count(ID), level 
from table1 
where createat >= "2013-11-22 00:00:00" and createat <= "2013-11-22 23:59:59" 
group by level;

select 
    count(ID), level 
from table1 
where createat >="2013-11-23 00:00:00" and createat <= "2013-11-23 23:59:59" 
group by level;

select 
    count(ID), level 
from table1 
where createat >= "2013-11-24 00:00:00" and createat <= "2013-11-24 23:59:59" 
group by level;

感谢您的帮助!我希望更多地了解如何编写这些。

【问题讨论】:

  • 1) 提供您使用的数据库类型 2) 使用日期函数从日期列中提取月份中的哪一天,并使用它来简化您的查询和按天分组,如果这是什么你想要

标签: sql select count group-by sum


【解决方案1】:
SELECT
  level,
  COUNT(CASE WHEN createat>='2013-11-22' and createat<'2013-11-23' THEN id ELSE NULL END)   AS day_1_count,
  COUNT(CASE WHEN createat>='2013-11-23' and createat<'2013-11-24' THEN id ELSE NULL END)   AS day_2_count,
  COUNT(CASE WHEN createat>='2013-11-24' and createat<'2013-11-25' THEN id ELSE NULL END)   AS day_3_count
FROM
  table1
GROUP BY
  level
WHERE
  createat>='2013-11-22' and createat<'2013-11-25'

不过,加入包含您需要的日期的表格可能更有意义,而不是硬编码它们。

另外,请注意 SQL 适用于固定数量的列,如果您希望一个查询 3 天然后重复使用 5 天,这将不起作用。为此,您需要将其保留为每行一个结果。

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT t.level, SUM(CASE WHEN DATE(createat) = '2013-11-22' THEN 1 ELSE 0 END) AS day1,
           SUM(CASE WHEN DATE(createat) = '2013-11-23' THEN 1 ELSE 0 END) AS day2,
           SUM(CASE WHEN DATE(createat) = '2013-11-24' THEN 1 ELSE 0 END) AS day3
    FROM table1 t
    WHERE DATE(t.createat) >= "2013-11-22" AND DATE(t.createat) <= "2013-11-24" 
    GROUP BY t.level;
    

    SELECT t.level, SUM(CASE WHEN t.createat >= "2013-11-22 00:00:00" AND t.createat <= "2013-11-22 23:59:59" THEN 1 ELSE 0 END) AS day1,
           SUM(CASE WHEN t.createat >= "2013-11-23 00:00:00" AND t.createat <= "2013-11-23 23:59:59" THEN 1 ELSE 0 END) AS day2,
           SUM(CASE WHEN t.createat >= "2013-11-24 00:00:00" AND t.createat <= "2013-11-24 23:59:59" THEN 1 ELSE 0 END) AS day3
    FROM table1 t
    WHERE t.createat >= "2013-11-22 00:00:00" AND t.createat <= "2013-11-24 23:59:59" 
    GROUP BY t.level;
    

    【讨论】:

      【解决方案3】:

      对您发布的查询的简单编辑是:

      select count(ID), level 
      from table1 
      where createat >= "2013-11-22 00:00:00" and createat <= "2013-11-22 23:59:59" 
      group by level
      union
      select count(ID), level 
      from table1 
      where createat >="2013-11-23 00:00:00" and createat <= "2013-11-23 23:59:59" 
      group by level
      union
      select count(ID), level 
      from table1 
      where createat >= "2013-11-24 00:00:00" and createat <= "2013-11-24 23:59:59" 
      group by level
      

      但是,如果您尝试获取每天的计数、级别值和日期,则可以使用如下查询:

      SELECT COUNT(*), level, CAST(createat AS DATE)
      FROM table1
      GROUP BY level, CAST(createat AS DATE)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-11
        • 1970-01-01
        • 1970-01-01
        • 2018-02-16
        • 2020-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多