Как сравнить несколько значений строк, чтобы получить процент? [Дубликат]

Симон Моурир дал этот пример :

object o = null;
DateTime d = (DateTime)o;  // NullReferenceException

, где unboxing преобразование (литье) из object (или из одного из классов System.ValueType или System.Enum или из типа интерфейса) - тип значения (кроме Nullable<>) сам по себе дает NullReferenceException.

В другом направлении конверсия бокса из a Nullable<>, которая имеет HasValue, равную false , на ссылочный тип, может дать ссылку null, которая затем может привести к NullReferenceException. Классический пример:

DateTime? d = null;
var s = d.ToString();  // OK, no exception (no boxing), returns ""
var t = d.GetType();   // Bang! d is boxed, NullReferenceException

Иногда бокс происходит по-другому. Например, с помощью этого не общего метода расширения:

public static void MyExtension(this object x)
{
  x.ToString();
}

следующий код будет проблематичным:

DateTime? d = null;
d.MyExtension();  // Leads to boxing, NullReferenceException occurs inside the body of the called method, not here.

Эти случаи возникают из-за специальных правил, используемых во время выполнения при боксе Nullable<> экземпляров.

39
задан pars 17 June 2010 в 13:41
поделиться

3 ответа

SELECT Category, COUNT(*) AS Total , (COUNT(*) / (SELECT COUNT(*) FROM Item WHERE Department='Popular')) * 100 AS 'Percentage to all items', 
FROM Item
WHERE Department='Popular'
GROUP BY Category;

Я не уверен в синтаксисе MySql, но вы можете использовать подзапрос, как показано.

49
ответ дан bleeeah 1 September 2018 в 09:55
поделиться
SET @total=0;

SELECT Category, count(*) as Count, count(*) / @total * 100 AS Percent FROM (
    SELECT Category, @total := @total + 1
    FROM Item
    WHERE Department='Popular') temp
GROUP BY Category;

Преимущество такого способа заключается в том, что вам не нужно дублировать условие WHERE, которое является тикающей бомбой замедленного действия в следующий раз, когда кто-то приходит обновить условие, но не понимает, что это два разных места.

Избегание условия дублирования WHERE также улучшает читаемость , особенно , если ваш WHERE более сложный (с несколькими объединениями и т. д.).

2
ответ дан Despertar 1 September 2018 в 09:55
поделиться

Это должно сделать это:

SELECT I.category AS category, COUNT(*) AS items, COUNT(*) / T.total * 100 AS percent
FROM Item as I,
     (SELECT COUNT(*) AS total FROM Item WHERE Department='Popular') AS T
WHERE Department='Popular'
GROUP BY category;
7
ответ дан OMG Ponies 1 September 2018 в 09:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: