【问题标题】:One `Select` query to generate 12 result sets一个`Select`查询生成12个结果集
【发布时间】:2014-11-16 01:51:57
【问题描述】:

我有一个名为 VAT 的表格,我需要生成每月的 VAT 报告。所以下面是我要做的......

    SELECT SUM(Amount) AS "January" 
    WHERE current_time_stamp BETWEEN '2014-01-01' AND '2014-01-310'
    FROM VAT

就像上面的查询一样,我有 12 个查询 1 月、2 月、3 月等。那么,不是写 12 个,有没有办法可以在 1 个查询中得到所有这些?

【问题讨论】:

    标签: mysql sql database select


    【解决方案1】:

    使用GROUP BY,像这样:

    SELECT SUM(Amount), MONTH(current_time_stamp) AS `Month` 
    FROM VAT
    WHERE current_time_stamp BETWEEN '2014-01-01' AND '2014-12-31'
    GROUP BY MONTH(current_time_stamp)
    

    但是,如果您有很多记录,它可能会很慢。

    【讨论】:

      【解决方案2】:

      类似的东西会延长到十二个月

      SELECT MAX(X.January) AS January, MAX(X.February) AS February FROM
      (
      SELECT SUM(Amount) AS January, 0 AS February
          WHERE current_time_stamp BETWEEN '2014-01-01' AND '2014-01-31'
          FROM VAT
      UNION
      SELECT 0 AS January, SUM(Amount) AS February
          WHERE current_time_stamp BETWEEN '2014-02-01' AND '2014-02-29'
          FROM VAT
      ) X
      

      或者你也可以这样做:

      SELECT 'January' AS Month, SUM(Amount) AS Amount
          WHERE current_time_stamp BETWEEN '2014-01-01' AND '2014-01-31'
          FROM VAT
      UNION
       SELECT 'February' AS Month, SUM(Amount) AS Amount
          WHERE current_time_stamp BETWEEN '2014-02-01' AND '2014-02-29'
          FROM VAT
      

      【讨论】:

        【解决方案3】:

        您可以在 case 语句中使用条件求和,下面的查询将为您提供一行 12 列的每月总和

        SELECT 
           SUM(case when current_time_stamp BETWEEN '2014-01-01' AND '2014-01-31' then Amount else 0 end) AS `January` ,
           SUM(case when current_time_stamp BETWEEN '2014-02-01' AND '2014-02-29' then Amount else 0 end) AS `Febuary` ,
           .
           .
           .
           SUM(case when current_time_stamp BETWEEN '2014-12-01' AND '2014-12-31' then Amount else 0 end) AS `December` 
         FROM VAT
        

        【讨论】:

          【解决方案4】:
          select t.mnth_amt,t.mnth 
          from (
               select sum(amount) as mnth_amt,MONTH(current_time_stamp ) as mnth from vat where current_time_stamp BETWEEN '2014-01-01' AND  
               '2014-12-31' GROUP BY MONTH(current_time_stamp) 
               ) t order by mnth
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-04-08
            • 1970-01-01
            • 2017-03-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多