2017-04-19 1 views
-1

wie kann ich zeigen alle Wochen (52) in aktuellen JahreSQL zeigt alle Wochen (52) im laufenden Jahr

ich diese Abfrage gemacht haben:

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, '') 

Ich glaube, ich brauche zu tun etwas in hier:

SELECT 
    IFNULL(DATE_FORMAT(q.date_add, '%Y WEEK %u'), 0) AS CurrentDate, 
    IFNULL(SUM(q.totalExcl),0) AS total 
FROM 

ich habe versucht haben IFNULL zu setzen, aber das gab mir das gleiche Ergebnis

das ist, was jetzt ich erhalte.

enter image description here

Es zeigt die aktuelle Woche 5 bis Woche 16. Es gibt auch nichts in Woche 1 bis Woche 4, weil es keine Daten in ist und es braucht es nur eine einfache Null (0)

Also zu zeigen, was ich will, ist es von Woche 1 bis Woche Standard zu zeigen, braucht 52 und wenn keine Daten nur 0

Die Abfrage jetzt arbeitet, ist ohne Fehler.

+1

Wochen ist immer eine interessante. Über welche Wochen sprechen Sie? Da Sie 52 sagten, nehme ich an, Sie meinen ISO-Wochen? – Jens

+0

Ja ISO Wochen voll 52 Wochen – Deniz

+0

IFNULL (DATE_FORMAT (q.date_add, '% Y WEEK% u')), 0) benutze diese – Jenish

Antwort

1

Um eine feste Anzahl von Wochen zu erhalten, ohne eine bestimmte Tabelle, habe ich dies versucht. Tabelle XX1 ist nur um den Test zu machen, können Sie mit einem Ihrer Tabelle ersetzen. Wenn es eine Anzahl von Datensätzen> = 366 hat, können Sie den CROSS JOIN eliminieren.

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 ; 

Ausgang:

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 

Ich glaube, Sie dies in einem Ort Ihrer Abfrage verwenden könnte (ich auf Ihre Anfrage natürlich keine Prüfung machen konnte)

Andere (und Hoffnung letzte) Version:

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

Fehlercode: 1046. Keine Datenbank ausgewählt Wählen Sie den Standard-DB aus, der verwendet werden soll, indem Sie auf seinen Namen in der SCHEMAS-Liste in der Seitenleiste doppelklicken. Ich machte eine Kopie und fügte es ein und es gab mir diesen Fehler – Deniz

+0

Jetzt habe ich das erste Skript ausgeführt, das funktioniert hat. das zweite Skript hat auch funktioniert, aber es hat das gleiche Ergebnis wie das Bild oben von Woche 5 bis Woche 16 ohne Fehler db: http://i.imgur.com/VuoJU2t.png – Deniz

+0

eine andere Version auch (geänderte Reihenfolge der beitreten) – etsa

0

In MariaDB, es ist wirklich einfach zu bauen eine Tabelle von Wochen:

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 | 
... 

auf dieser Grundlage können Sie:

  • JOIN auf den Tisch und verwenden wk nach Bedarf.
  • Ändern Sie den Starttermin mit dem Sonntag statt Montag (oder was auch immer)
  • Go für so viele Wochen auszurichten, wie Sie
  • beschränken den Bereich nach der Tat mit WHERE wk BETWEEN ...
  • Durch so etwas wie CONCAT('2017 WEEK ', seq) AS iso holen möchten, können Sie Erhalte die von dir gewünschte Syntax.
Verwandte Themen