Mysql 显示本年度所有周数(52)的SQL

Mysql 显示本年度所有周数(52)的SQL,mysql,sql,mariadb,Mysql,Sql,Mariadb,如何显示当前年度的所有周数(52) 我提出这个问题: SELECT COALESCE(IF(DATE_FORMAT(q.date_add, '%Y-%u') IS NULL, (DATE_FORMAT(q.date_add, '%Y-%u')), DATE_FORMAT(q.date_add, '%Y WEEK %u'))) AS CurrentDate, COALESCE(IF(SUM(q.totalExcl)

如何显示当前年度的所有周数(52)

我提出这个问题:

SELECT 
    COALESCE(IF(DATE_FORMAT(q.date_add, '%Y-%u') IS NULL,
                (DATE_FORMAT(q.date_add, '%Y-%u')),
                DATE_FORMAT(q.date_add, '%Y WEEK %u'))) AS CurrentDate,
    COALESCE(IF(SUM(q.totalExcl) IS NULL,
                0,
                SUM(q.totalExcl))) AS total
FROM
    expoled.ps_oxoquotation_quotationstate_history h
        RIGHT JOIN
    expoled.ps_oxoquotation_quotation q ON h.idQuotation = q.idQuotation
        LEFT JOIN
    expoled.ps_employee e ON h.idEmployee = e.id_employee
        INNER JOIN
    expoled.ps_sv_employee_meta m ON h.idEmployee = m.id_employee
WHERE
    h.idEmployee = 39
        AND YEAR(q.date_add) = YEAR(UTC_TIMESTAMP())
        AND h.idQuotationState = 3
GROUP BY IFNULL(CurrentDate, '')
我想我需要在这里做点什么:

SELECT 
    IFNULL(DATE_FORMAT(q.date_add, '%Y WEEK %u'), 0) AS CurrentDate,
    IFNULL(SUM(q.totalExcl),0) AS total
FROM
我曾尝试将IFNULL设置为空,但这给了我相同的结果

这就是我现在得到的:

它显示从第5周到第16周的当前周数。 第1周到第4周也没有任何内容,因为第1周中没有数据。这里只需要显示一个简单的零(0)

所以我想要的是,它需要显示从第1周到第52周的标准,如果没有数据,只需要0


查询现在正在运行,没有任何错误。

为了获得固定的周数,没有特定的表,我尝试了以下方法。 表XX1只是为了进行测试,您可以用您的表中的一个代替。如果它的记录数>=366,则可以消除交叉连接

CREATE TABLE XX1 (id INT);
INSERT INTO XX1 VALUES (1);
INSERT INTO XX1 VALUES (2);
INSERT INTO XX1 VALUES (3);
INSERT INTO XX1 VALUES (4);
INSERT INTO XX1 VALUES (5);

SELECT DISTINCT DATE_FORMAT(RN, '%Y w%u') AS CURR_WEEK
FROM 
  (SELECT @RN:=DATE_ADD(str_to_date(  CONCAT(YEAR(UTC_TIMESTAMP()) ,'0101'), '%Y%m%d'), INTERVAL -1 DAY) AS RN
   UNION ALL 
   SELECT @RN:=DATE_ADD(@RN, INTERVAL 1 DAY) AS RN 
   FROM (SELECT 1 AS DUM FROM XX1
           CROSS JOIN XX1 X2
           CROSS JOIN XX1 X3
           CROSS JOIN XX1 X4
         ) Y LIMIT 366
   ) X
   WHERE YEAR(RN)=YEAR(UTC_TIMESTAMP())
   ORDER BY 1;
DROP TABLE XX1 ;
输出:

    CURR_WEEK
1   2017 w00
2   2017 w01
3   2017 w02
4   2017 w03
5   2017 w04
...
51  2017 w50
52  2017 w51
53  2017 w52
我想你可以用它来代替你的查询(当然我不能对你的查询做任何测试)

其他(希望是最后一个)版本:

SELECT Y.CURR_WEEK,
            COALESCE(SUM(qh.totalExcl), 0) AS total
        FROM 
        (SELECT DISTINCT DATE_FORMAT(RN, '%Y-%u') AS CURR_WEEK
                     FROM 
                      (SELECT @RN:=DATE_ADD(str_to_date(  CONCAT(YEAR(UTC_TIMESTAMP()) ,'0101'), '%Y%m%d'), INTERVAL -1 DAY) AS RN
                       UNION ALL 
                       SELECT @RN:=DATE_ADD(@RN, INTERVAL 1 DAY) AS RN 
                       FROM XX1
                       CROSS JOIN XX1 X2
                       CROSS JOIN XX1 X3
                       CROSS JOIN XX1 X4
                       ) X
                       WHERE YEAR(RN)=YEAR(UTC_TIMESTAMP())
                       ) Y
        LEFT JOIN (SELECT q.date_add, q.totalExcl, h.idEmployee 
                    FROM expoled.ps_oxoquotation_quotation q 
                    INNER JOIN expoled.ps_oxoquotation_quotationstate_history h ON h.idQuotation = q.idQuotation
                    WHERE h.idEmployee = 39 AND h.idQuotationState = 3) qh ON DATE_FORMAT(qh.date_add, '%Y-%u')=Y.CURR_WEEK 
        /* are these useless? */
        LEFT JOIN expoled.ps_employee e ON qh.idEmployee = e.id_employee
        LEFT JOIN expoled.ps_sv_employee_meta m ON qh.idEmployee = m.id_employee
        GROUP BY Y.CURR_WEEK

为了获得固定的周数,没有特定的表,我尝试了这个。 表XX1只是为了进行测试,您可以用您的表中的一个代替。如果它的记录数>=366,则可以消除交叉连接

CREATE TABLE XX1 (id INT);
INSERT INTO XX1 VALUES (1);
INSERT INTO XX1 VALUES (2);
INSERT INTO XX1 VALUES (3);
INSERT INTO XX1 VALUES (4);
INSERT INTO XX1 VALUES (5);

SELECT DISTINCT DATE_FORMAT(RN, '%Y w%u') AS CURR_WEEK
FROM 
  (SELECT @RN:=DATE_ADD(str_to_date(  CONCAT(YEAR(UTC_TIMESTAMP()) ,'0101'), '%Y%m%d'), INTERVAL -1 DAY) AS RN
   UNION ALL 
   SELECT @RN:=DATE_ADD(@RN, INTERVAL 1 DAY) AS RN 
   FROM (SELECT 1 AS DUM FROM XX1
           CROSS JOIN XX1 X2
           CROSS JOIN XX1 X3
           CROSS JOIN XX1 X4
         ) Y LIMIT 366
   ) X
   WHERE YEAR(RN)=YEAR(UTC_TIMESTAMP())
   ORDER BY 1;
DROP TABLE XX1 ;
输出:

    CURR_WEEK
1   2017 w00
2   2017 w01
3   2017 w02
4   2017 w03
5   2017 w04
...
51  2017 w50
52  2017 w51
53  2017 w52
我想你可以用它来代替你的查询(当然我不能对你的查询做任何测试)

其他(希望是最后一个)版本:

SELECT Y.CURR_WEEK,
            COALESCE(SUM(qh.totalExcl), 0) AS total
        FROM 
        (SELECT DISTINCT DATE_FORMAT(RN, '%Y-%u') AS CURR_WEEK
                     FROM 
                      (SELECT @RN:=DATE_ADD(str_to_date(  CONCAT(YEAR(UTC_TIMESTAMP()) ,'0101'), '%Y%m%d'), INTERVAL -1 DAY) AS RN
                       UNION ALL 
                       SELECT @RN:=DATE_ADD(@RN, INTERVAL 1 DAY) AS RN 
                       FROM XX1
                       CROSS JOIN XX1 X2
                       CROSS JOIN XX1 X3
                       CROSS JOIN XX1 X4
                       ) X
                       WHERE YEAR(RN)=YEAR(UTC_TIMESTAMP())
                       ) Y
        LEFT JOIN (SELECT q.date_add, q.totalExcl, h.idEmployee 
                    FROM expoled.ps_oxoquotation_quotation q 
                    INNER JOIN expoled.ps_oxoquotation_quotationstate_history h ON h.idQuotation = q.idQuotation
                    WHERE h.idEmployee = 39 AND h.idQuotationState = 3) qh ON DATE_FORMAT(qh.date_add, '%Y-%u')=Y.CURR_WEEK 
        /* are these useless? */
        LEFT JOIN expoled.ps_employee e ON qh.idEmployee = e.id_employee
        LEFT JOIN expoled.ps_sv_employee_meta m ON qh.idEmployee = m.id_employee
        GROUP BY Y.CURR_WEEK

在MariaDB中,构建周表非常容易:

mysql> SELECT ('2017-01-02' + INTERVAL seq WEEK) AS wk FROM seq_0_to_53;
+------------+
| wk         |
+------------+
| 2017-01-02 |
| 2017-01-09 |
| 2017-01-16 |
| 2017-01-23 |
| 2017-01-30 |
| 2017-02-06 |
| 2017-02-13 |
| 2017-02-20 |
...
基于此,您可以:

  • JOIN
    到您的表中,并根据需要使用
    wk
  • 将开始日期更改为与星期日对齐,而不是与星期一(或其他任何日期)对齐
  • 你想去多久就去多久
  • 使用
    WHERE wk-BETWEEN…
  • 通过将类似于
    CONCAT('2017 WEEK',seq)的内容提取为iso
    ,您可以获得所需的语法

在MariaDB中,创建周表非常容易:

mysql> SELECT ('2017-01-02' + INTERVAL seq WEEK) AS wk FROM seq_0_to_53;
+------------+
| wk         |
+------------+
| 2017-01-02 |
| 2017-01-09 |
| 2017-01-16 |
| 2017-01-23 |
| 2017-01-30 |
| 2017-02-06 |
| 2017-02-13 |
| 2017-02-20 |
...
基于此,您可以:

  • JOIN
    到您的表中,并根据需要使用
    wk
  • 将开始日期更改为与星期日对齐,而不是与星期一(或其他任何日期)对齐
  • 你想去多久就去多久
  • 使用
    WHERE wk-BETWEEN…
  • 通过将类似于
    CONCAT('2017 WEEK',seq)的内容提取为iso
    ,您可以获得所需的语法

几周总是很有趣的一周。你说的是什么样的一周?既然你说的是52,我想你是指ISO周?是的,ISO周整整52周IFNULL(DATE_格式(q.DATE_add,%Y WEEK%u')),0)使用它它它给我的结果是相同的IFNULL(DATE_格式(q.DATE_add,%Y WEEK%u'),0)作为当前日期,IFNULL(SUM(q.totalExcl),0)作为总数与你的问题没有直接关系,但ISO周增加到53,而不是52。几周总是很有趣的。你说的是什么样的一周?既然你说的是52,我想你是指ISO周?是的,ISO周整整52周IFNULL(DATE_格式(q.DATE_add,%Y WEEK%u')),0)使用它它它给我的结果是相同的IFNULL(DATE_格式(q.DATE_add,%Y WEEK%u'),0)作为当前日期,IFNULL(SUM(q.totalExcl),0)作为总数与你的问题没有直接关系,但ISO周增加到53,而不是52。错误代码:1046。未选择任何数据库通过双击侧栏中模式列表中的数据库名称来选择要使用的默认数据库。我做了一个拷贝并粘贴了它,它给了我这个错误。现在我运行了第一个脚本,它可以工作了。第二个脚本也起了作用,但从第5周到第16周,它给出了与上面图片相同的结果,没有任何错误db:也发布了另一个版本(更改了加入顺序)现在我得到了52周的结果,但数字不正确:我想它给出了所有员工的名称结果,数字[总数]错误代码:1046。未选择任何数据库通过双击侧栏中模式列表中的数据库名称来选择要使用的默认数据库。我做了一个拷贝并粘贴了它,它给了我这个错误。现在我运行了第一个脚本,它可以工作了。第二个脚本也起作用了,但从第5周到第16周,它给出了与上面图片相同的结果,没有任何错误db:也发布了另一个版本(更改了加入顺序)现在我得到了52周的结果,但数字不正确:我想它给出了所有员工的结果,包括数字[total]