【问题标题】:Sort SQL table to show first row and Sum of all others排序 SQL 表以显示第一行和所有其他表的总和
【发布时间】:2015-01-09 10:58:43
【问题描述】:

如何让下表仅在新列中显示具有最早日期的行和具有相同项目 ID 的“数量”之和。

如下图,

Name  ItemID   Date         Qty
A     A0001    25-Feb-14    23
B     A0001    01-Apr-14    4
C     A0001    18-Jul-14    54
D     K0006    03-Mar-14    86
E     K0006    11-Jan-14    29
F     X0003    27-Sep-14    19
G     X0003    12-Nov-14    28

结果应该是这样的,

Name   ItemID   Date        Qty  Total Outstanding
A      A0001    25-Feb-14   23   81
E      K0006    11-Jan-14   29   115
F      X0003    27-Sep-14   19   47

【问题讨论】:

    标签: sql-server sorting select group-by views


    【解决方案1】:
    SELECT a.Name,a.ItemID,b.Date,a.Qty,b.Total FROM TableA a
    INNER JOIN (SELECT ItemID,MIN(Date) AS Date,SUM(Qty)
    AS Tatal FROM TableA GROUP BY ItemID)b ON
    b.ItemID=a.ItemID AND a.Date=b.Date
    

    【讨论】:

    • 这肯定不会产生 OP 想要的结果!你测试过吗?
    【解决方案2】:
    DECLARE @T TABLE (NAME VARCHAR(10),Itemid VARCHAR(10),da date,qty int)
    
    insert into @T(NAME,Itemid,da,qty) values ('A','A0001','2014-02-25',23),
    ('B','A0001','2014-04-01',4),
    ('C','A0001','2014-07-18',54),
    ('D','K0006','2014-03-03',86),
    ('E','K0006','2014-01-11',29),
    ('F','X0003','2014-09-27',19),
    ('G','X0003','2014-11-11',28)
    
    
    
    
     ;with cte as (
        select *,SUM(qty)OVER(PARTITION BY Itemid  )total,
        ROW_NUMBER()OVER(PARTITION BY Itemid ORDER BY da )RN from @T
        group by NAME,Itemid,da,qty
        )
    
        select NAME,Itemid,convert(varchar,da,100)As [date],qty,total from cte 
        WHERE RN = 1 
    

    【讨论】:

    • 太棒了! 终于有人明白这个问题了!甚至比使用窗口函数(分区,结束)的人!
    【解决方案3】:
    Select Name, AliasID, DateAlias, Quantity, TotalOutstanding 
    from TableA A join 
            (Select ItemId as AliasID,Min(Date) as DateAlias,
            Sum(Quantity) as TotalOutstanding 
            from TableA
            group by ItemID )V
            on A.ItemID=V.ItemID
    

    【讨论】:

    • 对不起,这肯定不会产生 OP 想要的结果!你测试过吗?
    【解决方案4】:

    试试这个:

    with CTE
    as(
    select  -- M.Name,
    SUM(M.Qty) TotalOTD,M.ItemID,MIN(M.Date) as MDate from myTestTable M
    GROUP BY M.ItemID )
    select Name,    D.ItemID,  Date ,   Qty, TotalOTD from CTE
    JOIN myTestTable D
    ON CTE.ItemID=D.ItemID and CTE.MDate=D.date
    

    输出

    Name    ItemID  Date        Qty TotalOTD
    A      A0001    2014-02-25  23  81
    E      K0006    2014-01-11  29  115
    F      X0003    2014-09-27  19  47
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 2021-07-31
      相关资源
      最近更新 更多