mysql: поля и count (*) союза

Вскоре после консультации, которую я сделал дни назад (mysql pivotar таблица, оказанный из полей json) я встретился с другой проблемой. Оказывается, что я должен получать поля нескольких союз и разделять это по общему количеству элементов, у которых есть союз.

в настоящее время я имею:

select
    concat("assembled") as field, concat("1") as veces,
    count(if(json_extract(filters, '$.assembled')= true,json_extract(filters, '$.assembled'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("windows") as field,concat("1") as veces,
    count(if(json_extract(filters, '$.osWindows')= true,json_extract(filters, '$.osWindows'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("linux") as field,concat("1") as veces,
    count(if(json_extract(filters, '$.osLinux')= true,json_extract(filters, '$.osLinux'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("mac") as field,concat("1") as veces,
    count(if(json_extract(filters, '$.osMac')= true,json_extract(filters, '$.osMac'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("sdcard") as field,concat("1") as veces,
    count(if(json_extract(filters, '$.sdCard')= true,json_extract(filters, '$.sdCard'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("usb") as field,concat("1") as veces,
    count(if(json_extract(filters, '$.usb')= true,json_extract(filters, '$.usb'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("ethernet") as field,concat("1") as veces,
    count(if(json_extract(filters, '$.ethernet')= true,json_extract(filters, '$.ethernet'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("wifi") as field,concat("1") as veces,
    count(if(json_extract(filters, '$.wifi')= true,json_extract(filters, '$.wifi'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("bluetooth") as field,concat("1") as veces,
    count(if(json_extract(filters, '$.bluetooth')= true,json_extract(filters, '$.bluetooth'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("Display") as field,concat("1") as veces,
    count(if(json_extract(filters, '$.integratedDisplay')= true,json_extract(filters, '$.integratedDisplay'),NULL))as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("touchable") as field,concat("1") as veces,
    count(if(json_extract(filters, '$.touchableDisplay')= true,json_extract(filters, '$.touchableDisplay'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("Camera") as field,concat("1") as veces,
    count(if(json_extract(filters, '$.integratedCamera')= true,json_extract(filters, '$.integratedCamera'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("Scanner") as field,concat("1") as veces,
    count(if(json_extract(filters, '$.builtinScanner')= true,json_extract(filters, '$.builtinScanner'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("mobileApp") as field,concat("1") as veces,
    count(if(json_extract(filters, '$.mobileApp')= true,json_extract(filters, '$.mobileApp'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("Computer") as field,concat("1") as veces,
    count(if(json_extract(filters, '$.integratedComputer')= true,json_extract(filters, '$.integratedComputer'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("closedFrame") as field,concat("1") as veces,
    count(if(json_extract(filters, '$.closedFrame')= true,json_extract(filters, '$.closedFrame'),NULL)) as cuenta
    from bigdata_filtered group by concat(ip, filtered_date)
union
select
    concat("securityLock") as field,concat("1") as veces,
    count(if(json_extract(filters, '$.securityLock')= true,json_extract(filters, '$.securityLock'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("emergencyStop") as field,concat("1") as veces,
    count(if(json_extract(filters, '$.emergencyStop')= true,json_extract(filters, '$.emergencyStop'),NULL)) as cuenta
    from bigdata_filtered group by concat(ip, filtered_date)
union
select
    concat("innerLight") as field,concat("1") as veces,
    count(if(json_extract(filters, '$.innerLight')= true,json_extract(filters, '$.innerLight'),NULL)) as cuenta
    from bigdata_filtered group by concat(ip, filtered_date)

Это производит мне таблицу со следующими данными:

+---------------+-------+--------+
| field         | veces | cuenta |
+---------------+-------+--------+
| assembled     | 1     |      1 |
| assembled     | 1     |      9 |
| assembled     | 1     |      0 |
| assembled     | 1     |      8 |
| assembled     | 1     |      4 |
| assembled     | 1     |      6 |
| assembled     | 1     |      5 |
| assembled     | 1     |      7 |
| assembled     | 1     |     17 |
| assembled     | 1     |     11 |
| assembled     | 1     |      3 |
| assembled     | 1     |     14 |
| assembled     | 1     |     13 |
| assembled     | 1     |     15 |
| assembled     | 1     |      2 |
| windows       | 1     |      0 |
| windows       | 1     |      9 |
| windows       | 1     |     25 |
| windows       | 1     |      2 |
| windows       | 1     |      6 |
| windows       | 1     |      5 |
| windows       | 1     |     11 |
| windows       | 1     |      1 |
| windows       | 1     |      8 |
| windows       | 1     |      4 |
| linux         | 1     |      0 |
| linux         | 1     |      4 |
| linux         | 1     |     11 |
| linux         | 1     |      1 |
| linux         | 1     |      9 |
| linux         | 1     |      8 |
| mac           | 1     |      0 |
| mac           | 1     |      9 |
| mac           | 1     |     11 |
| mac           | 1     |      1 |
| mac           | 1     |      8 |
| sdcard        | 1     |      0 |
| sdcard        | 1     |      9 |
| sdcard        | 1     |     11 |
| sdcard        | 1     |      1 |
| sdcard        | 1     |      8 |
| usb           | 1     |      0 |
| usb           | 1     |      8 |
| usb           | 1     |      9 |
| usb           | 1     |     20 |
| usb           | 1     |      5 |
| usb           | 1     |      7 |
| usb           | 1     |      4 |
| usb           | 1     |      1 |
| usb           | 1     |      2 |
| ethernet      | 1     |      0 |
| ethernet      | 1     |      1 |
| ethernet      | 1     |      4 |
| ethernet      | 1     |      2 |
| ethernet      | 1     |      5 |
| wifi          | 1     |      0 |
| wifi          | 1     |      5 |
| wifi          | 1     |      1 |
| wifi          | 1     |      2 |
| bluetooth     | 1     |      0 |
| bluetooth     | 1     |      1 |
| Display       | 1     |      0 |
| Display       | 1     |      8 |
| Display       | 1     |      4 |
| Display       | 1     |      7 |
| Display       | 1     |      9 |
| Display       | 1     |      3 |
| Display       | 1     |      1 |
| Display       | 1     |     13 |
| Display       | 1     |     15 |
| Display       | 1     |      5 |
| touchable     | 1     |      0 |
| touchable     | 1     |      2 |
| touchable     | 1     |      1 |
| Camera        | 1     |      0 |
| Scanner       | 1     |      0 |
| mobileApp     | 1     |      0 |
| Computer      | 1     |      0 |
| closedFrame   | 1     |      0 |
| closedFrame   | 1     |      1 |
| securityLock  | 1     |      1 |
| securityLock  | 1     |      0 |
| emergencyStop | 1     |      0 |
| emergencyStop | 1     |      1 |
| innerLight    | 1     |      0 |
| innerLight    | 1     |      1 |
+---------------+-------+--------+
86 rows in set (0,50 sec)

Моя цель сейчас состоит в том, чтобы получать эту же самую таблицу, но с полем "разами", разделенным по 86. А именно, общее количество элементов, которые следуют из консультации... союза!!!

изначально я включил всю консультацию союз в таком select, который я схватил:

select field, veces, cuenta 
from (
    ... // aqui va todo el select/union

) as T1;

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

count (*):

select field, разы / count (*), счет from (...//сюда идет весь select/union

) эксперт Т1;

результат:

+---------------------+-------+
| T1.field / count(*) | veces |
+---------------------+-------+
|                   0 | 1     |
+---------------------+-------+
1 row in set, 1 warning (0,51 sec)

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

Спасибо заранее, и Счастливого Рождества!!!

3
задан 13.04.2017, 16:00
0 ответов

Ты можешь использовать прямо функцию avg:

SELECT avg(veces) FROM(
     //Aquí tu select union
) AS media

И он возвратит тебе средний показатель стоимости колонны veces.

0
ответ дан 03.12.2019, 17:56
  • 1
    Тебе остается решать половину проблемы @Angel (разделять поле T1 по nú морской окунь линий) –  29.12.2016, 12:58
  • 2
    @DavidIsla Ты Имеешь razó n, уже я изменил ответ. Большое спасибо из-за объявления. –  29.12.2016, 13:03

Поскольку быстрое резюме, я должен делать все в консультации из-за технического решения (мы используем администратор, который только допускает консультации, и ничего не можем программировать в). Кроме того, также он не позволяет мне использовать вещи как set @var=0. Главная проблема состоит в том, что я не могу делать count () или avg () благодаря тому, что я не имею, чтобы группировать один, пойдите уникум в результате. :(

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

select  field, if(cuenta>0, 100, 0) /
(select count(*) from(
  select
      concat("assembled") as field,
      count(if(json_extract(filters, '$.assembled')= true,json_extract(filters, '$.assembled'),NULL)) as cuenta
      from bigdata_filtered  group by concat(ip, filtered_date)
  union
  select
      concat("windows") as field,
      count(if(json_extract(filters, '$.osWindows')= true,json_extract(filters, '$.osWindows'),NULL)) as cuenta
      from bigdata_filtered  group by concat(ip, filtered_date)
  union
  select
      concat("linux") as field,
      count(if(json_extract(filters, '$.osLinux')= true,json_extract(filters, '$.osLinux'),NULL)) as cuenta
      from bigdata_filtered  group by concat(ip, filtered_date)
  union
  select
      concat("mac") as field,
      count(if(json_extract(filters, '$.osMac')= true,json_extract(filters, '$.osMac'),NULL)) as cuenta
      from bigdata_filtered  group by concat(ip, filtered_date)
  union
  select
      concat("sdcard") as field,
      count(if(json_extract(filters, '$.sdCard')= true,json_extract(filters, '$.sdCard'),NULL)) as cuenta
      from bigdata_filtered  group by concat(ip, filtered_date)
  union
  select
      concat("usb") as field,
      count(if(json_extract(filters, '$.usb')= true,json_extract(filters, '$.usb'),NULL)) as cuenta
      from bigdata_filtered  group by concat(ip, filtered_date)
  union
  select
      concat("ethernet") as field,
      count(if(json_extract(filters, '$.ethernet')= true,json_extract(filters, '$.ethernet'),NULL)) as cuenta
      from bigdata_filtered  group by concat(ip, filtered_date)
  union
  select
      concat("wifi") as field,
      count(if(json_extract(filters, '$.wifi')= true,json_extract(filters, '$.wifi'),NULL)) as cuenta
      from bigdata_filtered  group by concat(ip, filtered_date)
  union
  select
      concat("bluetooth") as field,
      count(if(json_extract(filters, '$.bluetooth')= true,json_extract(filters, '$.bluetooth'),NULL)) as cuenta
      from bigdata_filtered  group by concat(ip, filtered_date)
  union
  select
      concat("Display") as field,
      count(if(json_extract(filters, '$.integratedDisplay')= true,json_extract(filters, '$.integratedDisplay'),NULL))as cuenta
      from bigdata_filtered  group by concat(ip, filtered_date)
  union
  select
      concat("touchable") as field,
      count(if(json_extract(filters, '$.touchableDisplay')= true,json_extract(filters, '$.touchableDisplay'),NULL)) as cuenta
      from bigdata_filtered  group by concat(ip, filtered_date)
  union
  select
      concat("Camera") as field,
      count(if(json_extract(filters, '$.integratedCamera')= true,json_extract(filters, '$.integratedCamera'),NULL)) as cuenta
      from bigdata_filtered  group by concat(ip, filtered_date)
  union
  select
      concat("Scanner") as field,
      count(if(json_extract(filters, '$.builtinScanner')= true,json_extract(filters, '$.builtinScanner'),NULL)) as cuenta
      from bigdata_filtered  group by concat(ip, filtered_date)
  union
  select
      concat("mobileApp") as field,
      count(if(json_extract(filters, '$.mobileApp')= true,json_extract(filters, '$.mobileApp'),NULL)) as cuenta
      from bigdata_filtered  group by concat(ip, filtered_date)
  union
  select
      concat("Computer") as field,
      count(if(json_extract(filters, '$.integratedComputer')= true,json_extract(filters, '$.integratedComputer'),NULL)) as cuenta
      from bigdata_filtered  group by concat(ip, filtered_date)
  union
  select
      concat("closedFrame") as field,
      count(if(json_extract(filters, '$.closedFrame')= true,json_extract(filters, '$.closedFrame'),NULL)) as cuenta
      from bigdata_filtered group by concat(ip, filtered_date)
  union
  select
      concat("securityLock") as field,
      count(if(json_extract(filters, '$.securityLock')= true,json_extract(filters, '$.securityLock'),NULL)) as cuenta
      from bigdata_filtered  group by concat(ip, filtered_date)
  union
  select
      concat("emergencyStop") as field,
      count(if(json_extract(filters, '$.emergencyStop')= true,json_extract(filters, '$.emergencyStop'),NULL)) as cuenta
      from bigdata_filtered group by concat(ip, filtered_date)
  union
  select
      concat("innerLight") as field,
      count(if(json_extract(filters, '$.innerLight')= true,json_extract(filters, '$.innerLight'),NULL)) as cuenta
      from bigdata_filtered group by concat(ip, filtered_date)
  )as C1

)

 as cuenta
from (
select
    concat("assembled") as field,
    count(if(json_extract(filters, '$.assembled')= true,json_extract(filters, '$.assembled'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("windows") as field,
    count(if(json_extract(filters, '$.osWindows')= true,json_extract(filters, '$.osWindows'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("linux") as field,
    count(if(json_extract(filters, '$.osLinux')= true,json_extract(filters, '$.osLinux'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("mac") as field,
    count(if(json_extract(filters, '$.osMac')= true,json_extract(filters, '$.osMac'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("sdcard") as field,
    count(if(json_extract(filters, '$.sdCard')= true,json_extract(filters, '$.sdCard'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("usb") as field,
    count(if(json_extract(filters, '$.usb')= true,json_extract(filters, '$.usb'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("ethernet") as field,
    count(if(json_extract(filters, '$.ethernet')= true,json_extract(filters, '$.ethernet'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("wifi") as field,
    count(if(json_extract(filters, '$.wifi')= true,json_extract(filters, '$.wifi'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("bluetooth") as field,
    count(if(json_extract(filters, '$.bluetooth')= true,json_extract(filters, '$.bluetooth'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("Display") as field,
    count(if(json_extract(filters, '$.integratedDisplay')= true,json_extract(filters, '$.integratedDisplay'),NULL))as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("touchable") as field,
    count(if(json_extract(filters, '$.touchableDisplay')= true,json_extract(filters, '$.touchableDisplay'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("Camera") as field,
    count(if(json_extract(filters, '$.integratedCamera')= true,json_extract(filters, '$.integratedCamera'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("Scanner") as field,
    count(if(json_extract(filters, '$.builtinScanner')= true,json_extract(filters, '$.builtinScanner'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("mobileApp") as field,
    count(if(json_extract(filters, '$.mobileApp')= true,json_extract(filters, '$.mobileApp'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("Computer") as field,
    count(if(json_extract(filters, '$.integratedComputer')= true,json_extract(filters, '$.integratedComputer'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("closedFrame") as field,
    count(if(json_extract(filters, '$.closedFrame')= true,json_extract(filters, '$.closedFrame'),NULL)) as cuenta
    from bigdata_filtered group by concat(ip, filtered_date)
union
select
    concat("securityLock") as field,
    count(if(json_extract(filters, '$.securityLock')= true,json_extract(filters, '$.securityLock'),NULL)) as cuenta
    from bigdata_filtered  group by concat(ip, filtered_date)
union
select
    concat("emergencyStop") as field,
    count(if(json_extract(filters, '$.emergencyStop')= true,json_extract(filters, '$.emergencyStop'),NULL)) as cuenta
    from bigdata_filtered group by concat(ip, filtered_date)
union
select
    concat("innerLight") as field,
    count(if(json_extract(filters, '$.innerLight')= true,json_extract(filters, '$.innerLight'),NULL)) as cuenta
    from bigdata_filtered group by concat(ip, filtered_date)
) as T1
;
0
ответ дан 03.12.2019, 17:56

Твой пример слишком подробный, и это осложняет немного Ваше следование. Я помещаю тебе пример более простой, чем ты хочешь достичь, посмотрим он стоит тебе:

declare @tabla as table (
    veces int,
    nombre char(50)
)

insert into @tabla values (1, 'Hola')
insert into @tabla values (1, 'Hello')
insert into @tabla values (1, 'Adios')
insert into @tabla values (1, 'Bye')

select veces, cuenta, cast(veces as decimal) / cuenta as Ratio from (
    select count(*) as Cuenta from @tabla
) as t1  inner join @tabla
on 1 = 1

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

select field, cast(veces as decimal) / cuenta, cuenta from (
    select count(*) as cuenta from (
        -- Aquí iría la consulta grande
    ) as t
) as t1 inner join (
    -- Aquí iría la consulta grande
) as t2
on 1 = 1

С другой стороны, и если ты позволяешь мне думать о том, что ты не спросил, я не сделал бы начальную консультацию со столькими СОЮЗ, который они повреждают серьезно результат той же самой. Поставили делать это просто с GROUP BY и один ВСТУПИЛ В БРАК? Обычно более интересно делать единственную консультацию, что столько консультаций с СОЮЗОМ.

Также я не понимаю, почему ты используешь CONCAT, чтобы помещать стоимость 1 в поле "разы", если потом ты будешь использовать это как десятичный, чтобы это разделять. Конечно был мотив, но было бы хорошим, что ты это объясняешь.

1
ответ дан 03.12.2019, 17:56
  • 1
    относительно которого я не спрашиваю, я использую союз, потому что это способ, что - encontado pivotar первоначальная таблица, чтобы получать данные, как они интересовали меня как колонны (ты можешь видеть это в es.stackoverflow.com/questions/37576/… ). Я думаю, что я протестировал тему group by, но я не решался то, что он искал, но если ты видишь какую-то форму, он тебе был бы благодарен за то, чтобы ты сказал ее мне :). Это Concat это доказательство, удалено) –  29.12.2016, 14:34
  • 2
    Относительно решения, поскольку я понимаю, он состоит в том, чтобы делать субконсультацию, чтобы получать общее количество реестров и потом использовать ее для деления. Я это сделал так, и реши проблему. То, что он перемещает, состоит в том, что оптимальной у него нет совсем не консультации :) Мы оставим оптимизацию для другого трэда в stackoverflow –  29.12.2016, 14:36
  • 3
    Способ делать ее ó ptima состоит в том, чтобы не повторять консультация два раза, а сохранять результат во временной таблице и читать ahí два раза, которые это sú per rá я прошу. Конечно, если тебя решила проблема, не забывай пометить ответ как vá lida, пожалуйста. Спасибо –  29.12.2016, 15:24

Теги

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