1

これが SQL クエリで可能かどうかはわかりませんが、やってみます。

SQL データベースに接続してクエリを実行し、その結果セットをグリッドビューにデータバインドする C# で SharePoint Web パーツを開発しています。正常に動作していますが、小さなひっかかりがあります。ほとんどの場合、クエリはすべてのフィールドに対して 1 つの結果のみを返します。情報を縦に表示しているので、おおよそ次のようになります。

Customer Name           Mr. Customer
Customer Address        980 Whatever St.
Customer City           Tallahassee

すべて正常に表示されます。ただし、データベース内のテーブルの 1 つは、ほぼ常に複数の結果を返します。各顧客は明らかに 1 つの名前、1 つの住所、1 つの都市などを持ちますが、すべての顧客は少なくとも 1 つの製品を持ち、その製品には少なくとも 1 つの材料。その情報を単独で表示するとしたら、次のようになります。

Product              Steel Type              Wood Type             Paper Type
-----------------------------------------------------------------------------
Widget               Thick                   Oak                   Bond
Whatsit              Thin                    Birch
Thingamabob                                  Oak                   Cardstock

理想的には、最終結果は次のようになると思います。

Customer Name           Mr. Customer
Customer Address        980 Whatever St.
Customer City           Tallahassee
Widget Steel            Thick
Widget Wood             Oak
Widget Paper            Bond
Whatsit Steel           Thin
Whatsit Wood            Birch
Thingamabob Wood        Oak
Thingamabob Paper       Cardstock

別の許容可能な結果は、次のようなもので、いくつかの列を追加しますが、それらのフィールドに対して複数の結果のみを返します。

Customer Name        Mr. Customer
Customer Address     980 Whatever St.
Customer City        Tallahassee
Product              Steel Type              Wood Type             Paper Type
Widget               Thick                   Oak                   Bond
Whatsit              Thin                    Birch
Thingamabob                                  Oak                             

私はどんな提案にもオープンです。可能であれば、これを別のクエリなしで結果セットに含めたいと思います。データを取り込むために使用しているコードは次のとおりです。

                    SqlDataAdapter da = new SqlDataAdapter();
                    da.SelectCommand = cmd;
                    DataSet ds = new DataSet();
                    da.Fill(ds, "Specs");
                    DataSet flipped_ds = FlipDataSet(ds);
                    DataView dv = flipped_ds.Tables[0].DefaultView;
                    GridView outputGrid = new GridView();
                    outputGrid.ShowHeader = false;
                    outputGrid.DataSource = dv;
                    outputGrid.DataBind();
                    Controls.Add(outputGrid);

SQL クエリをリストしますが、膨大です。現在、100 をはるかに超えるフィールドを引き込んでおり、SUBSTRING の書式設定と連結が多数行われているため、スペースが無駄になりますが、実際には AS ステートメントでフィールドを選択して取得するかなり単純なクエリです。必要な名前を付け、いくつかの LEFT JOIN を使用して、いくつかのクエリを実行せずに必要なデータを取得します。製品/材料テーブルのスキーマは次のようになります。

fldMachineID
fldProductType
fldSteel
fldWood
fldPaper

したがって、明らかに、各顧客には、異なる fldProductType 値ごとに 1 つずつ、多数のエントリがあります。何かを省略している場合は、追加できます。みんなの時間と助けに感謝します!

4

2 に答える 2

2

これを試して:

DECLARE @TableA  table (RowID int, Value1 varchar(5), Value2 varchar(5))
DECLARE @TableB  table (RowID int, TypeOf varchar(10))
INSERT INTO @TableA VALUES (1,'aaaaa','A')
INSERT INTO @TableA VALUES (2,'bbbbb','B')
INSERT INTO @TableA VALUES (3,'ccccc','C')
INSERT INTO @TableB VALUES (1,'wood')
INSERT INTO @TableB VALUES (2,'wood')
INSERT INTO @TableB VALUES (2,'steel')
INSERT INTO @TableB VALUES (2,'rock')
INSERT INTO @TableB VALUES (3,'plastic')
INSERT INTO @TableB VALUES (3,'paper')


;WITH Combined AS
(
SELECT
    a.RowID,a.Value1,a.Value2,b.TypeOf
    FROM @TableA                 a
        LEFT OUTER JOIN @TableB  b ON a.RowID=b.RowID

)
SELECT
    a.*,dt.CombinedValue
    FROM @TableA        a
        LEFT OUTER JOIN (SELECT
                             c1.RowID
                                 ,STUFF(
                                            (SELECT
                                                 ', ' + TypeOf
                                                 FROM Combined  c2
                                                 WHERE c2.rowid=c1.rowid
                                                 ORDER BY c1.RowID, TypeOf
                                                 FOR XML PATH('') 
                                            )
                                            ,1,2, ''
                                       ) AS CombinedValue
                             FROM Combined c1
                             GROUP BY RowID
                        ) dt ON a.RowID=dt.RowID

出力:

RowID       Value1 Value2 CombinedValue
----------- ------ ------ ------------------
1           aaaaa  A      wood
2           bbbbb  B      rock, steel, wood
3           ccccc  C      paper, plastic
于 2010-02-26T16:39:00.290 に答える
1

たとえば、h@@p://stackoverflow.com/questions/2344590/how-do-i-transform-rows-into-columns-in-sql-server-2005 を参照してください。多くの場合、C# でこれを行う方が簡単であることに同意します。

KM が提案したことは、この記事で詳しく説明されています: http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

于 2010-03-02T11:21:57.207 に答える