需要在SQL Server中汇总和计算一组常用记录

时间:2016-05-06 02:07:42

标签: sql sql-server count group-by distinct

基本上,我有一个切割优化器,可以通过“挤出”和“切割长度”输出“切割”列表。我的主要目标是将其缩减为总结的切片。下面是几行显示,但有一个场景我最终会有1000多个削减。最终会有很多“挤出”,每个都有相同的“削减”。

    Cut_ID | Ext_ID | CutLength
      1         1         139
      2         1         139
      3         2         139
      4         2         139
      5         3         139
      6         3         130
      7         4         285

我正在尝试做的是识别并将所有类似的“挤出”分组为具有相应“数量”的“组”...像这样:

    ExtGroup | Qty 
        1       2      
        2       1      
        3       1    

之后,我会将所有内容放入相应的表中,以显示每个“组”需要的剪切长度

    ExtGroup | CutLength 
        1         139
        1         139
        2         139
        2         130
        3         265

让我知道我是否应该从另一个角度处理这个问题.....我需要最终制作一个简单的报告/图形供人们打印车辙并放在剪贴板上以便在切割挤压时参考

感谢

编辑:更改了一些术语,并试图澄清一些有点模糊的东西。 Stock_ID现在称为Ext_ID ...,表示单个挤出

3 个答案:

答案 0 :(得分:0)

这是SQL Server的痛苦。我认为最简单的方法就是使用聚合字符串连接来定义各个部分。

可以在SQL Server中执行此操作:

select row_number() over (select NULL)) as pieceId,
       count(*) as numstocks
from (select stockid,
             stuff((select ',' + cast(cutlength as varchar(255))
                    from t t2
                    where t2.stockid = t.stockid
                    for xml path ('')
                   ), 1, 1, '') as cuts
      from t
      group by stockid
     ) s
group by cuts;

答案 1 :(得分:0)

您要做的是称为规范化。目的是减少数据库中的冗余信息,使其更易于维护。一般来说,这是一件好事,所以你走在正确的轨道上。

在数据仓库中,常用的是反规范化的相反方法,但在这种情况下不适用。

你可以在这里阅读更多相关信息:维基百科>数据库规范化:https://en.wikipedia.org/wiki/Database_normalization

如果你想深入了解它,Chris Date是领先的大师。他出版了许多书籍,包括:数据库设计和关系理论,由O'Reilly Media出版。然而,他的书对于这种情况来说有点沉重和过度杀伤。

你可以像这样为大小和股票创建单独的表。

CREATE TABLE dbo.Size
(
    SizeID int NOT NULL PRIMARY KEY,
    CutLength int NOT NULL
);

CREATE TABLE dbo.Stock
(
    StockID int NOT NULL PRIMARY KEY,
    [Description] nvarchar(50) NOT NULL,
    SizeID int NOT NULL FOREIGN KEY REFERENCES dbo.Size(SizeID),
    Quantity int NOT NULL
);

然后在表格中插入一些值。

INSERT INTO dbo.Size (SizeID, CutLength)
    VALUES
    (1, 139),
    (2, 139),
    (3, 285);

INSERT INTO dbo.Stock (StockID, [Description], SizeID, Quantity)
    VALUES
    (101, N'Plastic', 1, 10),
    (102, N'Metal', 1, 25),
    (103, N'Plastic', 2, 15),
    (104, N'Metal', 2, 75),
    (105, N'Plastic', 3, 12);

当您想报告时,您可以像这样“加入”这两个表。

SELECT S.StockID, S.[Description], S.SizeID, Z.CutLength, S.Quantity
    FROM dbo.Stock AS S
        INNER JOIN dbo.Size AS Z
            ON Z.SizeID = S.SizeID
    ORDER BY StockID;

这给出了以下结果。

enter image description here

答案 2 :(得分:0)

谢谢....我睡了一觉然后又回到了绘图板。

决定为每次挤压重新格式化我的优化器的输出,以便将切割列为以分号分隔的字符串。它使重复组合和计数变得更加容易。当我检索数据时,我可以用分号分割切割。

    group_id | qty |        Cuts                
       1       27     138.18750;138.18750;
       2       22     67.56250;67.56250;67.56250;67.56250;
       3       15     89.31250;89.31250;89.31250;
       4       15     88.93750;88.93750;88.93750;