sql - 在不使用 group by 子句的情况下按列对结果进行分组

标签 sql sql-server-2012

我有以下查询:

SELECT 
   s.nsn,
   CAST(ms.msDli AS VARCHAR) + CAST(pe.peDli AS VARCHAR) as dli,
   p.engineNo, m.mopNo, sh.carName, 
   s.qty, s.msdSr, s.msdUr,
   (SELECT MAX(s.Qty) FROM spares s) MaxQuantity
FROM 
   spares s, mop m, pms p, car sh, subEquipment sub, mainSystem ms, parentEquipment pe, car_parentEquipment spe
WHERE 
    s.mopId = m.mopId 
    AND m.pmsId = p.pmsId 
    AND p.subId = sub.subId 
    AND sub.peId = pe.peId 
    AND sub.shId = sh.shId 
    AND pe.peId = spe.peId 
    AND spe.shId = sh.shId 
    AND pe.msId = ms.msId
ORDER BY 
    s.demandDate DESC, s.nsn

返回结果如下:

nsn dli engineNo    mopNo   carName qty msdSr   msdUr   MaxQuantity
098 58011   235     235     TOYOTA  50  98      98          897
235 58011   235     235     TOYOTA  12  25      235     897
098 55511   98      987     COROLLA 98  98      908         897
897 58011   235     235     TOYOTA  23  897     897     897

我想要的是根据第一列即 NSN

合并这个结果

这样所有具有相似 NSN 的汽车一起显示,最后一列显示最大数量(是 qty. 列中的最大值:

例如在上面的例子中,结果应该是这样的:

nsn dli engineNo    mopNo   carName qty msdSr   msdUr   MaxQuantity
098 58011   235     235    TOYOTA   98  98      98      98
098 55511   98      987     COROLLA 50  98      908     98
235 58011   235     235     TOYOTA  235 25      235     12
897 58011   235     235     TOYOTA  897 897     897     23

我不想要 Group By 解决方案,因为它会要求我将所有列包含在 group by 或 aggregate 子句中,并且无法理解那一团糟,请帮我解决带有子查询的问题或者如果可能的话加入?


应用 Gordon Linoff 解决方案

with t as (
    SELECT 
       s.nsn,
       CAST(ms.msDli AS VARCHAR) + CAST(pe.peDli AS VARCHAR) as dli,
       p.engineNo, m.mopNo, sh.carName, 
       s.qty, s.msdSr, s.msdUr,
       (SELECT MAX(s.Qty) FROM spares s) MaxQuantity
    FROM 
       spares s, mop m, pms p, car sh, subEquipment sub, mainSystem ms, parentEquipment pe, car_parentEquipment spe
    WHERE 
        s.mopId = m.mopId 
        AND m.pmsId = p.pmsId 
        AND p.subId = sub.subId 
        AND sub.peId = pe.peId 
        AND sub.shId = sh.shId 
        AND pe.peId = spe.peId 
        AND spe.shId = sh.shId 
        AND pe.msId = ms.msId
    ORDER BY 
        s.demandDate DESC, s.nsn)
    select t.*, max(qty) over (partition by nsn) as MaxQuantity
    from t
    order by nsn;

最佳答案

听起来您想要窗口函数 max() over。这将获得每个组的最大值,但是,它不是对值进行分组,而是将值附加到每一行:

with t as (your query here)
    select t.*, max(qty) over (partition by nsn) as MaxQuantity
    from t
    order by nsn;

关于sql - 在不使用 group by 子句的情况下按列对结果进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20789109/

相关文章:

sql - 如何根据最大日期获取不同的记录?

sql - 如何判断 VARCHAR 变量是否包含子字符串?

java - 使用 Java 将数据发送到 Microsoft Word 文档

PHP 面向对象 : Duplicate Code in a Class

sql - 索引和嵌套集

sql-server - 对远程服务器的访问被拒绝,因为当前安全上下文不受信任,SQL Server 代理

sql - 查询以计算演出收入占所有演出总收入的比例

mysql - 获取最新的行并将其与另一个表链接?

mysql - 使用 MySQL 数据库触发器

c# - 在 IIS 上应用程序无法打开 SQL 连接