当我的所有其他列都包含在报告中时,如何对重复值求和?

时间:2018-10-30 08:03:58

标签: sql-server sql-server-2008

我的问题描述:

这是我在SQL SERVER中的表:(以前输入的是包含的数据。)

ID   CodeColumn  NameColumn QNT UnitCost Description
1       121        lute     3    100000    blah
3       122       Leather   10   50000     blah

我有一个C#程序,其中包含所有这些列的可重复文本框。

这是我的addgoods存储过程:

CREATE procedure AddGoods

@QCode nvarchar(50),
@QName nvarchar(50),
@QQNT int,
@QUnitCost int,
@QDR int,
@QDesc nvarchar(250)

as
Insert Into GoodsTable1(CodeColumn,NameColumn,QTYColumn,UnitCostColumn,DiscountRateColumn,DescriptionColumn) values (@QCode,@QName,@QQNT,@QUnitCost,@QDR,@QDesc)
return

这是我想要的报告存储过程:(对我大吼)

SELECT ROW_NUMBER() Over (ORDER BY namecolumn) AS RowNumberColumn,
 CodeColumn,
 NameColumn,
 SUM(QNTColumn) AS QNT,
 UnitCostColumn,
 DiscountRateColumn,
 SUM(UnitCostColumn) AS Total,
 DescriptionColumn
FROM GoodsTable1
GROUP BY NameColumn

当我从用户那里得到输入时,每次输入相同的代码或名称,我都希望quantity column的值是输入中商品可重复值的总和。 另外,我希望将UnitCost Column的值求和并显示为TotalColumn

例如: (正如我所说的,这些数据是先前输入的)

1       121        lute     3    100000    blah
3       122       Leather   10   50000     blah

当我从用户那里获得新输入时,例如:

121        lute     5    100000    information

我希望能够从我的数据库中进行报告:

121        lute     8    100000    *(blah gets deleted)* information

我在查询中尝试了此操作,以避免出现错误:

select
    NameColumn,
    SUM(QTYColumn),
    SUM(UnitCostColumn)
    FROM GoodsTable1
GROUP BY NameColumn

它可以工作,但我也需要其他列。

2 个答案:

答案 0 :(得分:0)

尝试像这样更改查询

SELECT ROW_NUMBER() Over (ORDER BY namecolumn) AS RowNumberColumn,
CodeColumn,
NameColumn,
SUM(QTYColumn) AS QTY,
UnitCostColumn,
DiscountRateColumn,
SUM(UnitCostColumn) AS Total,
DescriptionColumn
FROM GoodsTable1
GROUP BY CodeColumn, NameColumn, UnitCostColumn, DiscountRateColumn, DescriptionColumn

您可以在SELECTGROUP BY子句中添加所需的其他字段,但是请确保具有唯一的值,因为会得到错误的结果。

答案 1 :(得分:0)

您的问题尚不清楚,其中包含一些差异。让我们尝试清理它:

您的列在示例数据中称为QNT,在查询中称为QTY。我怀疑这只是一个错误。其他列也一样。假设您的表格看起来像下面的示例:

DECLARE @table TABLE
(
    ID int identity,
    CodeColumn varchar(8),
    NameColumn nvarchar(20),
    QtyColumn int,
    UnitCostColumn decimal(15,2),
    DescriptionColumn nvarchar(MAX),
    DiscountRateColumn decimal(15,2) DEFAULT (0.0)
)

INSERT @table(CodeColumn, NameColumn, QtyColumn, UnitCostColumn, DescriptionColumn) VALUES
(121, 'lute', 3, 100000, 'blah'),
(122, 'Leather', 10, 50000, 'blah'),
(121, 'lute', 5, 100000, 'blah')

然后,您可以按以下方式计算运行总计:

SELECT *,
    SUM(QtyColumn) OVER (PARTITION BY CodeColumn ORDER BY ID) RunningQty,
    SUM(UnitCostColumn) OVER (PARTITION BY CodeColumn ORDER BY ID) RunningCost
FROM @table

结果:

ID   CodeColumn NameColumn   QtyColumn   UnitCostColumn  DescriptionColumn  DiscountRateColumn   RunningQty  RunningCost
---- ---------- ------------ ----------- --------------- ------------------ -------------------- ----------- ------------
1    121        lute         3           100000.00       blah               0.00                 3           100000.00
3    121        lute         5           100000.00       blah               0.00                 8           200000.00
2    122        Leather      10          50000.00        blah               0.00                 10          50000.00

我也希望您正在尝试仅保留每个组中的最后一条记录。上面的查询可以改写为:

SELECT */*select all columns you need*/ FROM (
    SELECT *,
        SUM(QtyColumn) OVER (PARTITION BY CodeColumn ORDER BY ID) RunningQty,
        SUM(UnitCostColumn) OVER (PARTITION BY CodeColumn ORDER BY ID) RunningCost,
        ROW_NUMBER() OVER (PARTITION BY CodeColumn ORDER BY ID DESC) LastRank
    FROM @table
) T WHERE T.LastRank=1

结果:

ID  CodeColumn NameColumn  QtyColumn   UnitCostColumn  DescriptionColumn  DiscountRateColumn  RunningQty  RunningCost  LastRank
--- ---------- ----------- ----------- --------------- ------------------ ------------------- ----------- ------------ ---------
3   121        lute        5           100000.00       blah               0.00                8           200000.00    1
2   122        Leather     10          50000.00        blah               0.00                10          50000.00     1

要提供更紧凑,更有效的解决方案,需要更多信息。