尝试对具有多个小数点的版本使用MAX SQL函数

时间:2014-06-20 22:06:32

标签: sql sql-server max aggregate

更新:现在我考虑一下,使用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

3 个答案:

答案 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。

您需要做一些事情:

  1. 转换FileVersion,以便将A.B.C.D简称为A;
  2. GROUP BY A值;
  3. 在外部UsageCount声明中再次汇总字段UsageTimeLastUsageSELECT
  4. 这可以做到,但需要注意的是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
    

    将来,如果您以原子方式存储版本数据,即作为单独的主要,次要,补丁,构建字段,这种事情会更容易;但是我知道版本控制格式各不相同,你可能无法将数据整合成一种一致的格式,所以也许这种情况不会发生。