更新:现在我考虑一下,使用MAX只会给我最新版本和最新版本的计数,而不是所有的计数和时间加起来为“版本10.如果有解决方法,请告诉我,以便我可以累计10版的所有计数和时间。*
use CM_CSA
SELECT DISTINCT
RS.Name0,
MU.UserName,
SF.FileName,
SF.FileVersion as 'FileVersion',
MUS.UsageCount as 'UsageCount',
MUS.UsageTime as 'UsageTime',
MUS.LastUsage as 'LastUsage'
FROM
v_MeteredUser MU
INNER JOIN (
SELECT ResourceID,MeteredUserID,FileID,SUM(UsageCount) as 'UsageCount',SUM(UsageTime) as 'UsageTime',MAX(LastUsage) as 'LastUsage'
FROM v_MonthlyUsageSummary
GROUP BY ResourceID,MeteredUserID,FileID
) MUS ON MU.MeteredUserID = MUS.MeteredUserID
INNER JOIN (
SELECT ResourceID,FileName,FileID,MAX(FileVersion) as 'FileVersion'
FROM v_GS_SoftwareFile
GROUP BY FileVersion,ResourceID,FileName,FileID
) SF ON MUS.FileID = SF.FileID
INNER JOIN v_R_System rs on rs.ResourceID = MUS.ResourceID
WHERE
SF.FileName like '%acrobat%'
and MU.UserName like '%jeffrey.toy%'
ORDER BY MU.UserName, SF.FileName, MUS.LastUsage
我得到的结果如下。显然,FileVersion的MAX函数不起作用,因为有多个小数位。如何解决这个问题,以便我只能显示Acrobat版本10(无小数点)所以它将所有4列相加。 结果:
Name0 UserName FileName FileVersion UsageCount UsageTime LastUsage
GLDLBAE016992 jeffrey.toy Acrobat.exe 10.1.5.33 3 498 6/4/2013
GLDLBAE016992 jeffrey.toy Acrobat.exe 10.1.7.27 13 6458 9/8/2013
GLDLBAE016992 jeffrey.toy Acrobat.exe 10.1.8.24 39 2301736 2/18/2014
GLDLBAE016992 jeffrey.toy Acrobat.exe 10.1.10.18 1 15 6/15/2014
GLDLBAE016992 jeffrey.toy Acrobat.exe 10.1.9.22 34 818966 6/15/2014
答案 0 :(得分:0)
好的改变我的答案,因为它没有帮助你。此时,由于您有一个查询可以获得结果而您只需要对它们进行分组,那么将整个事物作为另一个选择如下所示。我要做的另外一点就是添加一块来获得" 10"这是我原来的答案。
SELECT Name0,
UserName,
FileName,
FileVersion,
SUM(UsageCount)
SUM(UsageTime)
MAX(LastUsage)
(SELECT DISTINCT
RS.Name0,
MU.UserName,
SF.FileName,
left(FileVersion,CHARINDEX('.', FileVersion, 1) - 1) as 'FileVersion',
MUS.UsageCount as 'UsageCount',
MUS.UsageTime as 'UsageTime',
MUS.LastUsage as 'LastUsage'
FROM
v_MeteredUser MU
INNER JOIN (
SELECT ResourceID,MeteredUserID,FileID,SUM(UsageCount) as 'UsageCount',SUM(UsageTime) as 'UsageTime',MAX(LastUsage) as 'LastUsage'
FROM v_MonthlyUsageSummary
GROUP BY ResourceID,MeteredUserID,FileID
) MUS ON MU.MeteredUserID = MUS.MeteredUserID
INNER JOIN (
SELECT ResourceID,FileName,FileID,MAX(FileVersion) as 'FileVersion'
FROM v_GS_SoftwareFile
GROUP BY FileVersion,ResourceID,FileName,FileID
) SF ON MUS.FileID = SF.FileID
INNER JOIN v_R_System rs on rs.ResourceID = MUS.ResourceID) a
WHERE
FileName like '%acrobat%'
and UserName like '%jeffrey.toy%'
GROUP BY Name0,
UserName,
FileName,
FileVersion
答案 1 :(得分:0)
您正在选择max(fileversion),然后在派生表(SF)中按Fileversion进行分组。将fileversion从您的分组中取出,这应该消除行乘法。借用其他答案,使用max(left(FileVersion,CHARINDEX('.', FileVersion, 1) - 1))
并从分组中删除filegversion。这应该给你一行。
答案 2 :(得分:0)
好的,基于这个评论:
我希望将所有版本的所有计数相加,并将其显示为单行中的版本10。每次安装补丁时,它都会创建一个单独的计数,我希望将所有这些计数合并,因为它都是Acrobat 10。
您需要做一些事情:
FileVersion
,以便将A.B.C.D
简称为A
; GROUP BY
A
值; UsageCount
声明中再次汇总字段UsageTime
,LastUsage
和SELECT
。这可以做到,但需要注意的是GROUP BY
计算值通常不具备性能,因为无法使用索引执行分组。
第一步有几种不同的选择;不幸的是,在SQL Server的情况下,内置的字符串拆分功能不是其中之一。您可以编写用户定义的函数,或使用@JChao的建议;还有一个有趣的黑客suggested in another question利用了PARSENAME()
:
PARSENAME('10.1.5.33', 4) -- returns '10'
PARSEDNAME()
用于此目的的限制很多 - 它只能识别.
作为分隔符,它从右到左计算元素(从1开始索引),它只输出最多4个元素,并没有给出你想要的整数输出。如果您确信自己不必处理除.
以外的分隔符或分隔符的三个以上的分隔符,那么可以找到一种方法来处理使用例如获得最左边的元素COALESCE()
...但是这有很多扭曲,所以现在让我们KISS,你可以使用最终适合你的任何功能。假设版本格式始终为A.B.C.D
,您可以使用:
PARSENAME(FileVersion, 4) AS 'FileVersion'
现在,这是一个计算值,所以当你转到GROUP BY
时,你不能只使用别名;你必须提供计算表达式(或将你的整个查询抛到子查询中......让我们在这里不要发疯):
GROUP BY PARSENAME(FileVersion, 4)
我不确定这些联接在这里真正为你做了什么,但根据结果说你说你的原始查询是给你的,尝试一下,看看它是否符合你的要求。寻找:
SELECT DISTINCT
RS.Name0,
MU.UserName,
SF.FileName,
PARSENAME(SF.FileVersion, 4) as 'FileVersion',
SUM(MUS.UsageCount) as 'UsageCount',
SUM(MUS.UsageTime) as 'UsageTime',
MAX(MUS.LastUsage) as 'LastUsage'
FROM
v_MeteredUser MU
INNER JOIN (SELECT ResourceID, MeteredUserID, FileID, SUM(UsageCount) AS 'UsageCount',
SUM(UsageTime) AS 'UsageTime', MAX(LastUsage) AS 'LastUsage'
FROM v_MonthlyUsageSummary
GROUP BY ResourceID, MeteredUserID, FileID
) MUS ON MU.MeteredUserID = MUS.MeteredUserID
INNER JOIN (SELECT ResourceID, FileName, FileID, MAX(FileVersion) as 'FileVersion'
FROM v_GS_SoftwareFile
GROUP BY FileVersion, ResourceID, FileName, FileID
) SF ON MUS.FileID = SF.FileID
INNER JOIN v_R_System rs ON rs.ResourceID = MUS.ResourceID
WHERE
SF.FileName like '%acrobat%'
and MU.UserName like '%jeffrey.toy%'
GROUP BY RS.Name0, MU.UserName, SF.FileName, PARSENAME(FileVersion, 4)
ORDER BY MU.UserName, SF.FileName, MUS.LastUsage
将来,如果您以原子方式存储版本数据,即作为单独的主要,次要,补丁,构建字段,这种事情会更容易;但是我知道版本控制格式各不相同,你可能无法将数据整合成一种一致的格式,所以也许这种情况不会发生。