2016-05-06 12 views
0

基本的には、「押し出し」と「切り取り長さ」で「切り取り」のリストを出力する切り取りオプティマイザがあります。私の主な目標は、これを要約されたカットシートにカットすることです。以下はショーのためのいくつかの行ですが、私が持っている1つのシナリオは1000以上のカットで終わります。彼らのそれぞれに同じ "カット"のセットで多くの "Extrusions"が終わる。私がやろうとしている何SQL Serverの一般的なレコードの集計と集計が必要

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と呼ばれています...単一の押し出しを表します

+0

Piece_Idとは何ですか?それはStock_Idですか? – Yatrix

+0

申し訳ありませんが、私には明らかではありません。出力を説明して、探しています。もう一度説明してください。 – KumarHarsh

+0

Stock_IDは、カットする必要がある特定の押出を指すのに使用するものです。その在庫IDには、一定の長さのカット(cut_id)が1つ以上あります。まったく同じ切り口の押し出しがたくさんあるかもしれないので、私は同じ "stock_ids"を対応する数量の単一の "piece_id"にグループ化しようとしています。 – markymark

答えて

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; 
0

を正規化と呼ばれています。その目的は、データベース内の冗長な情報を減らすことで、メンテナンスを容易にします。一般的に、これは良いことですので正しい方向に進みます。

データウェアハウスでは、逆正規化が一般的に使用されますが、この場合は適用されません。

あなたがここでそれについての詳細を読むことができます:ウィキペディア>データベースの正規化を:https://en.wikipedia.org/wiki/Database_normalization

あなたは深さでそれについて学びたいのであれば、クリス日は大手の第一人者です。 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); 

レポートする場合は、このように2つのテーブルを「結合」することができます。

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

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;