Подсчитать количество столбцов, которые не являются нулевыми в строке

Я работаю с laravel чуть более 8 месяцев, и у меня есть проблема, когда я хочу показать процент завершения в таблице. поэтому идея, которую я имел, заключалась в том, что я собирался подсчитать количество столбцов, которые не являются нулевыми в строке, а затем разделить на количество столбцов в строке и умножить на 100.

Что-то вроде (NumberOfNotNullColumns/totalNumberOfColumns)*100

Но проблема в том, что я не могу получить NumberOfNotNullColumns в выбранной строке.

    $pos_info =  DB::select(DB::raw('SHOW COLUMNS FROM resource'));
        $pos_info_act =  DB::select(DB::raw('SELECT count(*) from resource WHERE * IS NOT NULL AND user_id = '.$resource->user_id));
foreach ($pos_info as $item) $base_columns += 1;
        $percentage = ($pos_info_act/$pos_info)*100;

как видите, у меня нет опыта работы с MySQL

Не могли бы вы показать нам атрибуты таблицы?

Piazzi 01.03.2019 12:49

Вы можете выбрать все необходимые столбцы, отфильтровать столбцы с нулевым значением и вычислить. Пробовали ли вы какой-либо код?

Sougata Bose 01.03.2019 12:50

Пожалуйста, не могли бы вы предоставить код, который вы написали, чтобы попробовать эту функцию.

George Hanson 01.03.2019 12:55

@LucasPiazzi, я хочу сделать то же самое с несколькими таблицами, поэтому я хочу, чтобы это было динамично

F. Mukwevho 01.03.2019 12:55
(User::whereNotNull('column')->count() / User::count()) * 100 или какая у вас модель...
JustCarty 01.03.2019 12:55

$pos_info = DB::select(DB::raw('ПОКАЗАТЬ КОЛОННЫ ИЗ ресурса')); $pos_info_act = DB::select(DB::raw('SELECT count(*) from resource WHERE * NOT NULL AND user_id = '.$resource->user_id)); $процент = ($pos_info_act/$pos_info)*100;

F. Mukwevho 01.03.2019 13:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
6
1 706
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете попробовать следующий запрос,

select (sum(case when column is not null then 1 else 0 end)/sum(case when column is null then 1 else 0 end))*100 from tableName

Использование модельного запроса

$all = Resource::count();
$notNull = Resource::whereNotNull('your_field_name')->count();
$percent = ($notNull/$all)*100;
print_r($percent);
exit;

Использование запроса к БД

$all = DB::table('resource')->count();
$notNull = DB::table('resource')->whereNotNull('your_field_name')->count();
$percent = ($notNull/$all)*100;
print_r($percent);
exit;

Вам нужно указать любой столбец, который является нулевым или не нулевым

Ответ принят как подходящий

Если кому интересно, вот как я это сделал

private function complete_percentage($model, $table_name, $resource){
    $pos_info =  DB::select(DB::raw('SHOW COLUMNS FROM '.$table_name));
    $base_columns = count($pos_info);
    $not_null = 0;
    foreach ($pos_info as $col){
        $not_null += app('App\\'.$model)::selectRaw('SUM(CASE WHEN '.$col->Field.' IS NOT NULL THEN 1 ELSE 0 END) AS not_null')->where('user_id', '=', $resource->user_id)->first()->not_null;
    }

    return ($not_null/$base_columns)*100;
}

Если кому-то интересно, PD: извините, я говорю по-испански, воспользуйтесь переводчиком на английский.

Тестирование в Lavarel 6

  //consulting specific user

   $user = User::find(Auth::id());
   //counters
   $contadornull = 0;
   $cantidadcampos = 0;

   // using $user->getFillable() for return all fields the model

    foreach ($user->getFillable() as $key => $campos) {

        //exclude data were user not filliables

        if ($campos != 'fotografia' && $campos != 'rango' && $campos != 'password' && 
         $campos != 'estatus')
        {
            //count all fields
            $cantidadcampos = $cantidadcampos + 1;
            //count fields where value is null

            if ($user->$campos != null)
            {
                $contadornull++;
            }
        }
        

        
    }
   //calculate percentage
    $porcentaje = $contadornull / $cantidadcampos * 100;

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

Adam Marshall 29.01.2021 21:58

объяснение находится в комментариях к коду. является действительным..?

Andersson Meza Andrade 02.02.2021 22:43

Другие вопросы по теме