1

我不确定这是否可以通过 SQL 查询实现,但我会试一试。

我正在用 C# 开发一个 SharePoint Web 部件,它连接到 SQL 数据库并运行查询,然后将该结果集数据绑定到 gridview。它工作正常,但我有一个小障碍。在大多数情况下,我的查询将为每个字段返回一个结果。我正在垂直显示信息,所以它看起来大致是这样的:

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                   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 查询,但它是巨大的。我现在正在提取超过一百个字段,有很多 SUBSTRING 格式和连接,所以这会浪费空间,但它确实是一个相当简单的查询,我用 AS 语句选择字段来获取我想要的名称,并使用一些 LEFT JOIN 来提取我需要的数据而无需多次查询。产品/材料表的架构是这样的:

fldMachineID
fldProductType
fldSteel
fldWood
fldPaper

很明显,每个客户都有许多条目,每个条目对应不同的 fldProductType 值。如果我遗漏了什么,我可以添加它。感谢大家的时间和帮助!

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

“翻转”数据集可以在 sql 中完成,例如参见 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 回答