如何转换此表:
+ ------------ + ----------------- +
|类别+子类别|
+ ------------ + ----------------- +
|猫.......... +波斯语......... |
|猫.......... + 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中显示它。
干杯!
答案 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