2017-04-19 47 views
-1

所有周(52)我该怎么让SQL显示本年度

我有此查询的所有周(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 

我已经tryed把IFNULL但给了我同样的结果

这就是我得到现在:

enter image description here

从5显示当前周至16周 还有什么在1周,直到第4周,因为在没有数据和那里需要显示只是一个简单的零(0)

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

查询工作,现在没有任何错误。

+1

星期总是一个有趣的。你在说什么几个星期?既然你说52,我认为你的意思是ISO周? – Jens

+0

是ISO周满52周 – Deniz

+0

IFNULL(DATE_FORMAT(q.date_add,'%Y WEEK%u')),0)使用此 – Jenish

回答

1

为了获得固定的周数,没有一个特定的表,我试过这个。 表XX1只是做测试,你可以用你的表中的一个替代。如果它有多条记录> = 366,则可以消除CROSS JOIN。

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 
+0

错误代码:1046.没有选择数据库通过在侧边栏的SCHEMAS列表中双击其名称来选择要使用的默认数据库。我做了一个副本并粘贴它,它给了我这个错误 – Deniz

+0

现在我确实运行了第一个可以工作的脚本。第二个脚本也工作,但它给出了与上面的图片从第5周到第16周相同的结果没有任何错误分贝:http://i.imgur.com/VuoJU2t.png – Deniz

+0

也发布了另一个版本(连接的改变顺序) – etsa

0

在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) AS iso可以获得你所要求的语法。