Отдельный процент для каждого пункта, пропускной способности

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

SELECT unitid, (COUNT(date)* 100/(SELECT COUNT(*) FROM items)) AS Percentage
FROM items
WHERE date !='Out'
GROUP BY unitid

EDIT1, разъяснение: Позволяет говорят, что у меня есть 2 из каждого продукта, продукт a, b, c, d и e, один из каждого пункта отсутствует. Результат, который я получаю:

    unitid    Percentage
1.  a         10
2.  b         10
3.  c         10
4.  d         10
5.  e         10

Я хотел бы, чтобы он показал это вместо этого:

    unitid    Percentage
1.  a         50
2.  b         50
3.  c         50
4.  d         50
5.  e         50

Спасибо:)

2
nl ja de
Можно ли, пожалуйста, показать некоторые типовые данные, объяснив проблему и желаемую продукцию?
добавлено автор Mahmoud Gamal, источник
Можно ли, пожалуйста, показать некоторые типовые данные, объяснив проблему и желаемую продукцию?
добавлено автор Mahmoud Gamal, источник
Можно ли, пожалуйста, показать некоторые типовые данные, объяснив проблему и желаемую продукцию?
добавлено автор Mahmoud Gamal, источник

4 ответы

Вам нужна связь между пунктами количества и отобранным пунктом.

SELECT
   unitid,
   COUNT(date) * 100
     /(SELECT COUNT(*) FROM items B WHERE B.unidid = A.unitid) AS Percentage
FROM items A
WHERE date !='Out'
GROUP BY unitid
2
добавлено
Это было немного Q&D, который я допускаю, но результат правилен. Гордонс подвергает сомнению don' t фильтруют в дату = ' out' так это won' t приводят к правильному ответу.
добавлено автор Ralf de Kleine, источник
Этот ответ не является лучшим, потому что он должен присоединиться к двум столам. Посмотрите Гордон Linoff' s ответ поскольку, как сделать это в единственном сканировании таблицы. Это также только даст проценты целого числа (такие как 33 ). Возвратить десятичные проценты с частями, такими как 33.33333 использование * 100.0 .
добавлено автор ErikE, источник
Это работало как очарование, спасибо:)
добавлено автор Swiftly, источник

Вам нужна связь между пунктами количества и отобранным пунктом.

SELECT
   unitid,
   COUNT(date) * 100
     /(SELECT COUNT(*) FROM items B WHERE B.unidid = A.unitid) AS Percentage
FROM items A
WHERE date !='Out'
GROUP BY unitid
2
добавлено
Это было немного Q&D, который я допускаю, но результат правилен. Гордонс подвергает сомнению don' t фильтруют в дату = ' out' так это won' t приводят к правильному ответу.
добавлено автор Ralf de Kleine, источник
Этот ответ не является лучшим, потому что он должен присоединиться к двум столам. Посмотрите Гордон Linoff' s ответ поскольку, как сделать это в единственном сканировании таблицы. Это также только даст проценты целого числа (такие как 33 ). Возвратить десятичные проценты с частями, такими как 33.33333 использование * 100.0 .
добавлено автор ErikE, источник
Это работало как очарование, спасибо:)
добавлено автор Swiftly, источник

Вы подвергаете сомнению, не требует подвопроса, просто условное скопление:

SELECT i.unitid, 100*sum(case when date <> 'Out' then 1 else 0 end)/count(date) as Percentage
FROM items i
GROUP BY unitid

Предполагая, что [дата] никогда не ПУСТОЕ, вы выражаете это проще как:

select i.unitid, 100*avg(case when date<>'out' then 1.0 else 0 end) as Percentage
from items i
group by unitid
2
добавлено
Это - лучший ответ. OP' s отобранный ответ не является лучшим, потому что это должно выполнить соединение, но этот вопрос сделает единственный просмотр.
добавлено автор ErikE, источник

Давайте посмотрим, понимаю ли я это правильно. Если у вас есть один a, два b, три c и четыре d's, один из каждого отсутствует, безотносительно то есть, ваш набор результатов должен быть:

    unitid    Percentage
1.  a         100.00
2.  b         50.00
3.  c         33.33
4.  d         25.00

Чтобы сделать это, можно попробовать это:

Select counts.unitId, 100.0 *outcounts.count/ counts.count  as Percentage
from (select unitid, count(*) as count 
        from items 
        where items.date ='Out' 
        group by unitid) as outcounts
  inner join (select unitid, count(*) as count 
              from items 
              group by unitid) as counts
    on outcounts.unitId = counts.unitId

вот Скрипка SQL с установкой

0
добавлено
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)