SQL - количество и процент - PullRequest
       3

SQL - количество и процент

0 голосов
/ 22 сентября 2011

врезался в стену при подсчете И процентах от общего количества в одном запросе

Я хочу ОБЩИЕ единицы в каждой локации И ПРОЦЕНТ ВСЕГО ПО ВСЕМ МЕСТАМ ...

то, что у меня есть - возвращает 0 (ноль) в процентах - я считаю, что мне нужно преобразовать цифру в десятичный или вещественный тип - но что бы я ни пытался (приведение каждого элемента или приведение целого результата - я получить ошибки ...)

SELECT 
count(I.ID) as count
,L.ID
,(
    count(I.ID) 
    / 
    ( SELECT count(I2.ID) 
      FROM LOCATION L2
      JOIN ITEM I2 ON I2.LocID = L2.ID
      WHERE L2.ID IN (36,38,39,40) )
) AS percent
FROM LOCATION L
JOIN ITEM I ON I.LocID = L.ID
WHERE L.ID IN (36,38,39,40)
GROUP BY L.ID

Есть мысли о том, как вернуть десятичное число ??? или просто сделать его более элегантным .. точка?

Что бы я "ожидал"

ID      COUNT   PERCENT
2436    362     30.47
2438    184     15.48
2439    173     14.56
2440    172     14.47
2441    151     12.71
2442    54      4.54
2702    92      7.74

======== «т» предложил это - считать (I.ID) * 100,0 / считать (*) сверх () AS процентов Что должен делать "over ()" ??

вот возвращение:

ID      COUNT   PERCENT
2436    362     51
2438    184     26
2439    173     24
2440    172     24
2441    151     21
2442    54      7
2702    92      13

========== РЕШЕНИЕ

SELECT 
   count(I.ID) as count
   ,L.ID
   ,(
    1.0 * count(I.ID) / (
      SELECT count(I2.ID) 
      FROM LOCATION L2
      JOIN ITEM I2 ON I2.LocID = L2.ID
      WHERE L2.ID = L1.ID )
   ) * 100  AS percent
   FROM LOCATION L
   JOIN ITEM I ON I.LocID = L.ID
WHERE L.ID IN (36,38,39,40)
GROUP BY L.ID

Ответы [ 3 ]

1 голос
/ 22 сентября 2011

Сначала проверьте, работает ли ваш запрос и возвращает ли правильные значения с:

SELECT 
count(I.ID) as count
,L.ID
,(SELECT count(I2.ID) 
      FROM LOCATION L2
      JOIN ITEM I2 ON I2.LocID = L2.ID
      WHERE L2.ID IN (36,38,39,40)
)
FROM LOCATION L
JOIN ITEM I ON I.LocID = L.ID
WHERE L.ID IN (36,38,39,40)
GROUP BY L.ID

Затем используйте правильный синтаксис для приведения в DB2:

CAST(%Expression% AS data-type)
1 голос
/ 22 сентября 2011

Просто умножьте на число с плавающей запятой / десятичное значение

SELECT 
   count(I.ID) as count
   ,L.ID
   ,(
    100.0 * count(I.ID) 
    / 
     (
      SELECT count(I2.ID) 
      FROM LOCATION L2
      JOIN ITEM I2 ON I2.LocID = L2.ID
      WHERE L2.ID = L1.ID
     )
   ) AS percent
   FROM LOCATION L
   JOIN ITEM I ON I.LocID = L.ID

 WHERE L.ID IN (36,38,39,40)
 GROUP BY L.ID

Кроме того, вам нужно учитывать делитель нуля, дающий ошибки «делить на ноль»

0 голосов
/ 22 сентября 2011

Вы можете использовать функцию ROUND () ...

ROUND(..., 2) AS percent

или просто умножить на десятичное значение (то есть 1.0).Вы также можете включить IF или CASE (в зависимости от вашего сервера SQL), чтобы обойти возможные нулевые значения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...