SQL合并具有动态列标题的行

时间:2016-02-12 06:08:14

标签: sql sql-server-2005 pivot transpose

我正在尝试填充Gridview,以便为每位学生启用checkbox es,但这取决于此查询中的某些值:

@SelectedDate通过TextBox提供为仅日期

SELECT  v1.StudentID,
        v1.StudentPreferredName + ' ' + v1.StudentFamilyName AS StudentName,
        bcs.CheckStatusName,
        rce.DateSubmitted,
        rcp.RollCallPeriod
FROM tblBoardingRollCallEntries AS rce
     INNER JOIN vwBoardingTenants AS v1
        ON v1.StudentID = rce.StudentID
       AND v1.[Year] = YEAR(@SelectedDate)
     INNER JOIN tblBoardingCheckStatus AS bcs
        ON bcs.CheckStatusID = rce.CheckStatusID
       AND bcs.StatusActive = 1
     INNER JOIN tblBoardingRollCallPeriods AS rcp
         ON rcp.RollCallPeriodID = rce.RollCallPeriodID
        AND rcp.PeriodYear = YEAR(@SelectedDate)
        AND @SelectedDate BETWEEN rcp.PeriodStart AND rcp.PeriodEnd
        AND rcp.RowStatus = 1
WHERE dbo.fnDateOnly(rce.DateSubmitted) = dbo.fnDateOnly(@SelectedDate)

我的网格视图:

显示以下内容:

enter image description here

数据:

enter image description here

我希望基本上能够将GridView中的行压缩为每行一个学生,并根据RollCallPeriod文本勾选复选框。

我正在玩SQL枢轴,以使数据尽可能接近我所追求的,以避免代码隐藏等。但是,我无法让它工作。

select StudentID, [1],[10],[2],[3],[4],[5],[6],[7],[8],[9]
      from
      (
        select StudentID, RollCallID, CheckStatusID
        from tblBoardingRollCallEntries
        unpivot
        (
          value for name in ([RollCallID],[StudentID],[CheckStatusID],[DateSubmitted],[StaffID])
        ) unpiv
      ) src
      pivot
      (
        sum(RollCallPeriodID)
        for RollCallPeriodID in ([1],[10],[2],[3],[4],[5],[6],[7],[8],[9])
      ) piv

我收到以下错误:

  

查找错误 - SQL Server数据库错误:列的类型   " StudentID"与在。中指定的其他列的类型冲突   UNPIVOT清单。

还有其他想法吗?

由于

2 个答案:

答案 0 :(得分:1)

两个选项:

  1. 而不是直接在shipping_hidden_tax_amount上进行展开:首先选择在派生表中强制转换为base_shipping_hidden_tax_amnt类型的列,然后shipping_incl_tax派生表。缩短的例子:
  2. base_shipping_incl_tax
    1. 使用gift_message_id进行取消转储,这样就可以UNPIVOT将列直接转换为适当的类型。

答案 1 :(得分:1)

根据您的实际数据,您可以通过以下两种方式执行此操作。

这会为CheckStatusName

提供RollCallPeriod作为值
SELECT  *
FROM    (
            SELECT  StudentName,
                    CheckStatusName,
                    RollCallPeriod
            FROM    [YourQueryGoesHere]
        ) t 
PIVOT   ( 
    MAX(CheckStatusName) 
    FOR RollCallPeriod IN ([6:15 AM],[8:00 AM],[3:00 PM],[6:00 PM],[9:00 PM]) 
) p

enter image description here

或者您获得状态并显示COUNT()以显示该学生是否具有该CheckStatusName, RollCallPeriod

的值
SELECT  *
FROM    (
            SELECT  StudentName,
                    CheckStatusName,
                    RollCallPeriod
            FROM    [YourQueryGoesHere]
        ) t 
PIVOT   ( 
    COUNT(RollCallPeriod) 
    FOR RollCallPeriod IN ([6:15 AM],[8:00 AM],[3:00 PM],[6:00 PM],[9:00 PM]) 
) p

enter image description here