【问题标题】:Custom query assistance needed需要自定义查询帮助
【发布时间】:2014-11-20 06:19:53
【问题描述】:

我有 3 个表:(针对这个问题进行了简化)

  • REQUIREMENTS:ID(PK),需求描述
  • CUSTOMERS : ID (PK), CustomerName
  • CUSTOMER_REQUIREMENTS(连接表):ID (PK)、RequirementID(FK 到 REQUIREMENTS 表)、CustomerID(FK 到 CUSTOMERS 表)、DateCompleted

问题:我需要在 asp.net 中创建一个 gridview,它基本上显示左侧的需求,所有客户作为列标题,DateCompleted 作为“交叉点”。我该怎么做?

例如:

【问题讨论】:

  • 向我们展示您的当前工作并说明您遇到的困难!

标签: sql asp.net sql-server vb.net


【解决方案1】:

尝试以下 sql 并用您的表替换临时表:

创建表#REQUIREMENTS ( ID INT, 需求描述 VARCHAR(100) )

创建表#CUSTOMERS ( ID INT, 客户名称 VARCHAR(100) )

创建表 #CUSTOMER_REQUIREMENTS ( ID INT, 需求ID INT, 客户 ID INT, 日期完成日期 )

插入#REQUIREMENTS 值(1,'Requirement1')

插入#REQUIREMENTS 值(2,'Requirement2')

插入#REQUIREMENTS 值(3,'Requirement3')

插入#REQUIREMENTS 值(4,'Requirement4')

插入 #CUSTOMERS 值 (1,'JOHN')

插入 #CUSTOMERS 值 (2,'MARY')

插入#CUSTOMERS 值(3,'BOB')

插入#CUSTOMER_REQUIREMENTS 值(1,1,1,'2-2-2014')

插入 #CUSTOMER_REQUIREMENTS 值(1,2,1,'2-2-2014')

插入 #CUSTOMER_REQUIREMENTS 值(1,1,2,'2-2-2014')

插入 #CUSTOMER_REQUIREMENTS 值(1,2,2,'2-2-2014')

插入#CUSTOMER_REQUIREMENTS 值(1,3,2,'2-2-2014')

插入#CUSTOMER_REQUIREMENTS 值(1,4,2,'2-2-2014')

将@DynamicPivotQuery 声明为 NVARCHAR(MAX)

将@ColumnName 声明为 NVARCHAR(MAX)

SELECT @ColumnName= ISNULL(@ColumnName + ',','') + QUOTENAME(CustomerName) FROM (SELECT DISTINCT CustomerName FROM #CUSTOMERS) 作为课程

SET @DynamicPivotQuery = N'SELECT ReqID, ReqDes, ' + @ColumnName + ' 从 ( 选择 TEMP.ReqID, TEMP.ReqDes, TEMP.CusName, CusReq.DateCompleted 从 ( 选择 req.ID 作为 ReqID, req.RequirementDescription 作为 ReqDes, cus.ID 作为 CusID, cus.CustomerName 作为 CusName 从 #REQUIREMENTS req,#CUSTOMERS 客户 ) 作为 TEMP 左连接 #CUSTOMER_REQUIREMENTS 作为 CusReq 在 TEMP.ReqID = CusReq.RequirementID AND Temp.CusID = CusReq.CustomerID ) 作为 TEMP1 PIVOT(MAX(TEMP1.DateCompleted) FOR CusName IN (' + @ColumnName + ')) AS PVTTable'

EXEC sp_executesql @DynamicPivotQuery

删除表#CUSTOMER_REQUIREMENTS

删除表#CUSTOMERS

删除表#REQUIREMENTS

【讨论】:

  • 谢谢!很好的例子!主处理(在创建/填充临时表之后)可以转换为没有变量的 1 行 SELECT 语句吗?
  • @WebDevGuy 如果正在旋转的列具有静态/固定数据,那么您可以用 select 语句替换动态查询。但是当列数据像客户一样是动态的时,是否添加了新客户并且您必须显示所有这些数据,那么您必须生成动态sql。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多