Sql 如何创建从查询返回值定义列名的视图

Sql 如何创建从查询返回值定义列名的视图,sql,database-design,pivot,Sql,Database Design,Pivot,首先,我的表格布局: tblEquippedItems:您在SQL Server 2005/2008中寻找的是一个透视/交叉表。不能在此基础上定义视图,因为视图必须是预定义的列。不过,您可以在存储过程中执行此操作 编辑:对于SQLServer2000,请看这个。虽然您将主要看到交叉选项卡/数据透视使用Count()或Sum()聚合,但您也可以轻松地在文本值上使用Max()和Min()。您将对数据库设计进行一些抨击。。。由于各种原因,这样的对象属性值表被认为是“邪恶的” 也就是说,当数据库模式需要

首先,我的表格布局:


tblEquippedItems:您在SQL Server 2005/2008中寻找的是一个透视/交叉表。不能在此基础上定义视图,因为视图必须是预定义的列。不过,您可以在存储过程中执行此操作


编辑:对于SQLServer2000,请看这个。虽然您将主要看到交叉选项卡/数据透视使用Count()或Sum()聚合,但您也可以轻松地在文本值上使用Max()和Min()。

您将对数据库设计进行一些抨击。。。由于各种原因,这样的对象属性值表被认为是“邪恶的”

也就是说,当数据库模式需要稳定,但属性的最终列表在变化时(以及当我能够承受性能后果时),我也会时不时地使用它们

通过使用视图,您至少走上了正确的道路,这将允许您在尘埃落定时使模式更加坚实

坏消息是:虽然可以使用PIVOT使SQL方面的工作更轻松,但查询本身需要使用您想要的实际列名进行编程

有三种方法可以做到这一点:

  • 添加/删除属性时手动修改视图(头痛)
  • 动态查询(混乱、速度较慢、无法使用视图、需要过程)
  • 创建一个存储过程,该存储过程使用动态SQL在修改属性(最复杂)后删除/创建所有视图

  • 我认为很多自连接都是有序的

        SELECT t1.charid,t1.itemid as shoulders,t2.itemid as helm,t3.itemid as legs
    FROM (SELECT charid,itemid from tblEquippedItems where slotid = 1) t1 //slotid = shuolders
    INNER JOIN (SELECT itemid from tblEquippedItems where slotid = 2) t2 //slotid = Helm
    ON t1.charid = t2.charid
    INNER JOIN (SELECT itemid from tblEquippedItems where slotid = 3) t3 //slotid = Legs
    ON t3.charid = t2.charid
    

    除此之外,当我需要进行交叉制表或数据透视时,您可以尝试使用数据透视,我通常在数据库之外进行这些操作

    我使用MS Excel,其中包含一个查询,以表格形式提取我需要的数据。然后,我在MS Excel中进行透视,以获得带有“动态列标题”的交叉表视图


    Excel远非唯一的选择。在顶端,您可以使用Cognos数据立方体之类的东西

    +1但别忘了实际将列别名,即aka
    作为肩部项目
    这是用于什么数据库(包括版本)?幸运的是,此表仅用于报告,因此我并不真正关心正确的设计和数据完整性,因为这在我的其他表中都有保证。这只是为了显示已被视为一致的数据报告。:)我喜欢这个主意。我一时忘记了我的基本知识。。。(嗯,我做的每件事都是相对基本的,因为我只是一名学生。)正如我在其他评论中所说的,这个表实际上根本不需要进行任何优化(只有一个用户。)并且它背后的数据已经是可靠和一致的。SQL server 2000中有Pivot吗?(这就是我相信我正在运行的。不过我会仔细检查一下。这是我学校的服务器,我以前没有遇到过版本兼容性问题……除了需要表变量时:()
    Pivot
    是在SQL 2005中引入的。在此之前,创建Pivot需要做大量的手工工作。请查看我的编辑,以获取有关如何完成此操作的链接。
        SELECT t1.charid,t1.itemid as shoulders,t2.itemid as helm,t3.itemid as legs
    FROM (SELECT charid,itemid from tblEquippedItems where slotid = 1) t1 //slotid = shuolders
    INNER JOIN (SELECT itemid from tblEquippedItems where slotid = 2) t2 //slotid = Helm
    ON t1.charid = t2.charid
    INNER JOIN (SELECT itemid from tblEquippedItems where slotid = 3) t3 //slotid = Legs
    ON t3.charid = t2.charid