2017-04-19 38 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可以獲得你所要求的語法。