我正在尝试生成一个返回像这样的表的查询(每个版本只出现一次,例如Windows 7)
但是,我只能生成这个(同一版本多次出现,例如Windows 7 Enterprise,Windows 7 Home,...)
这是我的代码
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”的名称下添加所有“Windows 7 Enterprise / Starter / ...”。
这会生成de table'Hardware'
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;
答案 0 :(得分:1)
您有两种选择:
1)在SQL上编写一个公式,只检索相关操作系统的一部分,在查询中创建一个新字段并按其分组。
2)创建一个包含两列的新表:OS实名和OS组名,如下所示:
RealOSName OSGroupName
-------------------------------- -----------------------
Microsoft Windows 7 Professional Windows 7
Microsoft Windows 7 Home Basic Windows 7
Microsoft Windows 7 Home Premium Windows 7
按OSGrupName(最佳选择)对您的查询进行分组
答案 1 :(得分: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
答案 2 :(得分:0)
osnamez = CASE WHEN PATINDEX('Windows' + '7',osname) > 0 THEN 'Windows 7'
ELSE osname
自解释。
检查结果的内容是否包含Windows 7的名称然后它将回显Windows 7
另一个解决方案:
PHP:
if(preg_match('/^[windows 7]*$/', $row['osname?']))
$row['osname?']= "Windows 7";
^不确定这是否是那个 但只需检查
preg_match
有一个适合它。