我怎样才能做到这一点 query/consultation?

How can i make this query/consultation?

我正在尝试生成一个 returns 和 table 类似的查询(每个版本只出现一次,例如 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;

这是 table '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;

您有两个选择:

1) 在 SQL 上编写公式以仅检索相关的操作系统部分 在您的查询中创建一个新字段并按其分组。

2) 创建一个包含两列的新 table: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 对您的查询进行分组(对我来说是最佳选择)

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

有一个。

我喜欢 ericpap 的第二个建议,但如果可能的话,我会采取稍微不同的方向,通过向您的硬件添加一个额外的列 table "osGroup" 或类似的

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

因此它可以填充如下数据:

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

等等

然后你的硬件 table 看起来像(剪掉几列

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

使用这种方法,您将面临用适当的组填充数据的挑战,尽管它更加规范化。