在asp.net中将表格“放在它的一边” - 怎么样?

时间:2011-02-09 17:46:06

标签: c# asp.net sql mysql

如何转换此表:

+ ------------ + ----------------- +
|类别+子类别|
+ ------------ + ----------------- +
|猫.......... +波斯语......... |
|猫.......... + Siamese ........ |
|猫.......... +虎斑........... |
|狗......... +贵宾犬.......... |
|狗......... +拳击手............ |
+ ------------ + ---------------- +

就此而言:

+ ------------ + ----------------- +
|猫......... +狗............. |
+ ------------ + ----------------- +
+波斯.. +贵宾犬......... +
+ Siamese + Boxer ........... + +缅甸语+ ................... + + ------------ + ----------------- +

初始表来自以下MySQL查询:

select c.CATEGORYNAME, sc.NAME from subcategorydefinition sc
  join categorydefinition c on sc.CATEGORYID = c.CATEGORYID
  where c.ISDELETED = 0
  order by CATEGORYNAME, NAME ASC

我想在(可能)Gridview中显示它。

干杯!

4 个答案:

答案 0 :(得分:4)

Pivot在SQL中是静态的。您需要提前知道输出中所需的列,因此如果类别列表未修复,则无法直接使用数据透视。

如果您使用的是Microsoft SQL Server(我知道您不是,但是为了示例),您可以在存储过程中使用动态查询,如下所述: http://www.simple-talk.com/community/blogs/andras/archive/2007/09/14/37265.aspx

现在,在MySql中,没有办法在sql端执行动态SQL(没有等效的EXECUTE或sp_executeqsl),所以你最好的选择是生成一个类似的SQL查询服务器端(aspnet服务器端)

另一个更简单的想法是IMHO会忘记在SQL中执行它,而是在C#代码中进行聚合。

答案 1 :(得分:0)

您应该使用pivot

答案 2 :(得分:0)

要在SQL中执行此操作,您需要根据“类别”列中的可用值集动态生成查询。无论您是在纯SQL(在sproc中)还是在代码(动态SQL)中执行此操作,这通常都非常痛苦并且容易出错。

我建议您以存储方式从数据库中读取值,然后动态创建DataTable或类似结构,以用作UI的数据源。

答案 3 :(得分:0)

我没有MySql的工作版本,但是只要总是有多只猫而不是狗,因为脚本末尾的左连接,这将有效。我忘记了MySql中没有完整的外部联接,但您可以使用此logic进行尝试。

但重点是,如果你有两个带有任意键的表,你可以加入键来获得你想要的结果。

-- drop tables
 DROP TABLE dbo.cat
 DROP TABLE dbo.dog

 --create dog table
 create table dog (
 dog_id int IDENTITY(1,1) NOT NULL
 ,dog varchar(50)
 )

 --add dogs only
 insert into dog (dog)
 select subcategory 
  FROM play.dbo.test 
 where category = 'Dog'

 --create cat table
 create table cat (
 cat_id int IDENTITY(1,1) NOT NULL
 ,cat varchar(50)
 )

 --add cats only
 insert into cat (cat)
 select subcategory 
  FROM play.dbo.test 
 where category = 'cat'

 -- disply everything
 SELECT cat 
      , dog
  from dog d
 --full outer join cat c
 left join dog d
 on d.dog_id = c.cat_id