Mysql: как получить результат COUNT () на основе данных

#mysql #select #count

#mysql #выберите #подсчет

Вопрос:

Я запутался, как получить некоторые данные из базы данных MySQL. У меня есть запрос, подобный:

 inspection_report table:
 - Inspection_datetime
 - Line
 - Model
 - Lot_no
 - Serial_number
 - Shift
 - Range_sampling
 - Accesories
 - Acc_qty
Employee table:
 - NIK
 - name

SELECT DATE(A.Inspection_datetime) AS Date, A.Line,TRIM(A.Model) AS Model, A.Lot_no,
       COUNT(A.Serial_number) AS Qty,GROUP_CONCAT(DISTINCT(A.Shift)) AS Shift,
       IF(RIGHT(A.Range_sampling,4)='0000',10000,RIGHT(A.Range_sampling,4))-MID(A.Range_sampling,5,4) 1 AS Merchandise,
       A.Accesories,A.Acc_qty,A.Range_sampling,B.name
FROM inspection_report A
LEFT JOIN Employee B
ON A.NIK=B.NIK
WHERE CHAR_LENGTH(A.Range_sampling) = 17 AND A.Issue='' AND A.Check='' AND A.Approve=''  
GROUP BY A.Line, A.Model, A.Lot_no, A.Range_sampling
ORDER BY Date DESC,A.Line
  

Я хочу показать данные из COUNT(A.Serial_number) AS Qty , которые имеют результат, подобный:

  • Кол-во = 20
  • Кол-во = 8
  • Кол-во = 32

Как мне это сделать, чтобы получить это?


результат, подобный:

 |Date      |Line   |Model |Lot_no| Qty|Shift|Merchandise|Accesories|Acc_qty|Range_sampling|name |
 ---------- ------- ------ ------ ---- ----- ----------- ---------- ------- -------------- ----- 
|2011-05-12| fa 02 |BlaBla|021A  | 20 |  A  |  200      |  OK      |11     |   1-200      |tom  |
|2011-05-12| fa 15 | foo  |021A  | 8  |  A  |  200      |  OK      |11     |   1-200      |Bill |
|2011-05-12| fa 01 | Boom |021A  | 32 |  A  |  200      |  OK      |11     |   1-200      | Jim | 
  

Комментарии:

1. пожалуйста, сообщите структуру вашей таблицы и их отношения

2. Вам нужно использовать HAVING (если я правильно понимаю вопрос).

3. Еще один момент: вы уверены, что вам не нужно группировать по A.NIK тоже? Что происходит, когда некоторые строки (которые относятся к одной группе) таблицы inspection_report имеют разные NIK значения? Как и сейчас, будет показан один из связанных B.name ов (более или менее случайным образом).

4. @ypercube: нет, мне не нужно группировать по нику. Пока этого достаточно.

5. Если вы знаете, что все строки в группе имеют одинаковое значение A.NIK , тогда да, вам тоже не нужно.

Ответ №1:

После того, как вы выполните GROUP BY , вы можете использовать HAVING для задания условий, на основании которых будут храниться агрегированные данные:

 SELECT DATE(A.Inspection_datetime) AS Date
     , A.Line
     , TRIM(A.Model) AS Model
     , A.Lot_no
     , COUNT(A.Serial_number) AS Qty
     , GROUP_CONCAT(DISTINCT(A.Shift)) AS Shift
     ,   IF( RIGHT(A.Range_sampling,4)='0000'
           , 10000
           , RIGHT(A.Range_sampling,4)
           )
       - MID( A.Range_sampling, 5, 4)
         1
       AS Merchandise
     , A.Accesories
     , A.Acc_qty
     , A.Range_sampling
     , B.name
FROM inspection_report A
    LEFT JOIN Employee B
       ON A.NIK=B.NIK
WHERE CHAR_LENGTH(A.Range_sampling) = 17 
  AND A.Issue='' 
  AND A.Check='' 
  AND A.Approve=''  
GROUP BY A.Line
       , A.Model
       , A.Lot_no
       , A.Range_sampling
HAVING COUNT(A.Serial_number) IN (20, 8, 32)
ORDER BY Date DESC
       , A.Line
  

Лучше не использовать LIKE с числовыми полями или вычисленными результатами. Это условие:

 Qty LIKE '20' OR Qty LIKE '8' OR Qty LIKE '32'
  

может быть записано, когда Qty является целым числом, как:

 Qty = 20 OR Qty = 8 OR Qty = 32
  

или эквивалентно как:

 Qty IN (20, 8, 32)
  

Ответ №2:

До сих пор я пробовал самостоятельно использовать SELECT inside SELECT :

 SELECT X.Date,X.Line,X.Model,X.Qty,...........
FROM(
      SELECT DATE(A.Inspection_datetime) AS Date, A.Line,TRIM(A.Model) AS Model, A.Lot_no,
             COUNT(A.Serial_number) AS Qty,GROUP_CONCAT(DISTINCT(A.Shift)) AS Shift,
             IF(RIGHT(A.Range_sampling,4)='0000',10000,RIGHT(A.Range_sampling,4))-MID(A.Range_sampling,5,4) 1 AS Merchandise,
             A.Accesories,A.Acc_qty,A.Range_sampling,B.name
      FROM inspection_report A
      LEFT JOIN Employee B
      ON A.NIK=B.NIK
      WHERE CHAR_LENGTH(A.Range_sampling) = 17 
      AND A.Issue='' AND A.Check='' AND A.Approve=''  
      GROUP BY A.Line, A.Model, A.Lot_no, A.Range_sampling
      ORDER BY Date DESC,A.Line) X
WHERE X.Qty LIKE '20' OR X.Qty LIKE '8' OR X.Qty LIKE '32'
  

После этого я получаю то, что хочу.
ИЛИ USE HAVING (самый простой способ).