2015-01-07 3 views
-3

я пытаюсь генерировать запрос, который возвращает таблицу, как это (только одно вхождения каждой версии, например, для Windows 7)Как я могу сделать этот запрос/консультацию?

enter image description here

Но, я только могу генерировать это (несколько вхождений для одной и той же версии, например. ОС Windows 7 Enterprise, Windows 7 Home, ...)

enter image description here

и это код, который i'had

SELECT osname as 'Sistema Operativo' , count(osname) as 'Total UC', 
COUNT(CASE WHEN TAG = 'VREG-DI' THEN 1 ELSE NULL END) as 'VRA-BIB' 
from hardware h, accountinfo 
where h.ID = accountinfo.HARDWARE_ID 
group by osname 

Я хочу добавить все "Windows 7 Enterprise/Starter/..." под названием "Windows 7".

Это создает де таблицы 'Оборудование'

CREATE TABLE IF NOT EXISTS `hardware` (
`ID` int(11) NOT NULL, 
`DEVICEID` varchar(255) NOT NULL, 
`NAME` varchar(255) DEFAULT NULL, 
`WORKGROUP` varchar(255) DEFAULT NULL, 
`USERDOMAIN` varchar(255) DEFAULT NULL, 
`OSNAME` varchar(255) DEFAULT NULL, 
`OSVERSION` varchar(255) DEFAULT NULL, 
`OSCOMMENTS` varchar(255) DEFAULT NULL, 
`PROCESSORT` varchar(255) DEFAULT NULL, 
`PROCESSORS` int(11) DEFAULT '0', 
`PROCESSORN` smallint(6) DEFAULT NULL, 
`MEMORY` int(11) DEFAULT NULL, 
`SWAP` int(11) DEFAULT NULL, 
`IPADDR` varchar(255) DEFAULT NULL, 
`DNS` varchar(255) DEFAULT NULL, 
`DEFAULTGATEWAY` varchar(255) DEFAULT NULL, 
`ETIME` datetime DEFAULT NULL, 
`LASTDATE` datetime DEFAULT NULL, 
`LASTCOME` datetime DEFAULT NULL, 
`QUALITY` decimal(7,4) DEFAULT NULL, 
`FIDELITY` bigint(20) DEFAULT '1', 
`USERID` varchar(255) DEFAULT NULL, 
`TYPE` int(11) DEFAULT NULL, 
`DESCRIPTION` varchar(255) DEFAULT NULL, 
`WINCOMPANY` varchar(255) DEFAULT NULL, 
`WINOWNER` varchar(255) DEFAULT NULL, 
`WINPRODID` varchar(255) DEFAULT NULL, 
`WINPRODKEY` varchar(255) DEFAULT NULL, 
`USERAGENT` varchar(50) DEFAULT NULL, 
`CHECKSUM` bigint(20) unsigned DEFAULT '262143', 
`SSTATE` int(11) DEFAULT '0', 
`IPSRC` varchar(255) DEFAULT NULL, 
`UUID` varchar(255) DEFAULT NULL, 
`ARCH` varchar(10) DEFAULT NULL 
) ENGINE=InnoDB AUTO_INCREMENT=24661 DEFAULT CHARSET=latin1; 

и это таблица 'AccountInfo'

CREATE TABLE IF NOT EXISTS `accountinfo` (
`HARDWARE_ID` int(11) NOT NULL, 
`TAG` varchar(255) DEFAULT 'NA', 
`fields_3` varchar(255) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
+4

Мне нравится часть, где есть два столбца, состоящие из чисел, но ни один столбец не назван или не описан на скриншоте, или вопрос. – Kritner

+0

можете ли вы предоставить то, что находится в таблицах 'hardware' и' accountinfo'? –

+1

Ум, разве они не те же, но с разными номерами? Я не вижу, что делает неправильным, а другое - правильным. –

ответ

0
osnamez = CASE WHEN PATINDEX('Windows' + '7',osname) > 0 THEN 'Windows 7' 
ELSE osname 

Самопознание.

Проверяется содержание результатов имеет Windows 7 в его имя, то это будет просто эхо Windows 7

другой soluton:

PHP:

if(preg_match('/^[windows 7]*$/', $row['osname?'])) 
$row['osname?']= "Windows 7"; 

^Не уверен, если это один , но только проверите

preg_match 

есть один для него.

+0

Спасибо, я делаю это, чтобы решить мою проблему и .. это работает! – Rod

+0

@Rod рад, что я мог бы помочь, пожалуйста, отметьте это как ответ. –

1

У вас есть два варианта:

1) Написать формулу на SQL для извлечения только соответствующая часть операционной системы создает новое поле в вашем запросе и группирует его.

2) Создать новую таблицу с двумя столбцами: OS настоящее имя, и название группы ОС, как это:

RealOSName       OSGroupName 
-------------------------------- ----------------------- 
Microsoft Windows 7 Professional Windows 7  
Microsoft Windows 7 Home Basic  Windows 7 
Microsoft Windows 7 Home Premium Windows 7 

И группа запрос по OSGrupName (лучший выбор для меня)

+0

Действительно хороший выбор, но я не могу вносить изменения в таблицы – Rod

+0

Вам не нужно менять таблицы. Вам нужно только добавить новый, чтобы группировать имена SO. – ericpap

1

Мне нравится второе предложение ericpap, хотя я бы взял его в несколько ином направлении, если это возможно, добавив дополнительный столбец в аппаратной таблице «osGroup» или аналогичный

osGroup table 
----- 
groupId int primary key identity 
groupName varchar(100) 

поэтому она может быть заполнена данными как:

groupId groupName 
----- 
1   Windows 7 
2   Windows 8 
3   Linux 
4   Mac 

и т.д.

тогда ваше оборудование таблица будет выглядеть (несколько колонок отрезала

osName        osGroup 
------- 
Mac OS X        4 
Miscrosoft Windows 7 Professional  1 

и т.д.

Это сделало бы ответ на ваш конкретный вопрос (или, по крайней мере, близко к этому - я не знаком с устаревшей запятой присоединиться синтаксис):

SELECT groupName as 'Sistema Operativo' , count(groupName) as 'Total UC', 
COUNT(CASE WHEN TAG = 'VREG-DI' THEN 1 ELSE NULL END) as 'VRA-BIB' 
from hardware h, accountinfo 
inner join osGroup o on h.groupId = o.groupId 
where h.ID = accountinfo.HARDWARE_ID 
group by groupName 

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

+0

Является действительно хорошим выбором, но я не могу вносить изменения в таблицы – Rod

+0

Я немного не понимаю, что вы надеетесь получить в ответ. Ваши данные не в форме, которую можно использовать так, как вы этого хотите. У вас есть информация, доступная вам **, чтобы сделать ** данные в форме, которую вы хотите, но не можете этого сделать. – Kritner

Смежные вопросы