【问题标题】:2005 SSRS/SQL Server PIVOT results need reversing2005 SSRS/SQL Server PIVOT 结果需要反转
【发布时间】:2014-06-18 02:01:32
【问题描述】:

序言:我已经阅读了三个问题/答案here,here, 和here,对@cade-roux 大加赞赏。这一切都源于试图在 2005 年 SSRS 矩阵中使用以下数据,我相信这不起作用,因为我想展示一个必须多次参加测试的成员,而 SSRS 似乎需要我想要的聚合显示所有日期。

我在表格中得到以下结果,似乎正确显示了所有数据:

如何更改下面的代码以显示 a) 每列顶部的“测试”以及 b) 如果需要,显示测试的多个日期?

这是我必须在上面生成表格的代码。大部分内容都被注释掉了,因为我只是想让枢轴工作,但您可能会注意到我也在尝试指定哪个测试列先出现。

    CREATE TABLE #tmp (     ---THIS WORKS BUT TESTS ARE VERTICAL
    [TEST] [varchar](30) NOT NULL,
    [ED] [datetime] NOT NULL
)

--WHERE THE TEST AND ED COME FROM
INSERT #TMP
SELECT DISTINCT
--      N.FULL_NAME
--      , CONVERT(VARCHAR(30), AM.CREATEDATE, 101) AS ACCOUNT_CLAIMED
--      , N.EMAIL
--      , NULL AS 'BAD EMAIL'
--      , CONVERT(VARCHAR(30), AC.EFFECTIVE_DATE, 101) AS EFFECTIVE_DATE
         AC.PRODUCT_CODE AS TEST
        , CONVERT(VARCHAR(30), AC.EFFECTIVE_DATE, 101) AS ED
--      , CASE
--          WHEN AC.PRODUCT_CODE = 'NewMem_Test' THEN '9'
--          WHEN AC.PRODUCT_CODE = 'NM_Course1' THEN '1'
--          WHEN AC.PRODUCT_CODE = 'NMEP_Course1' THEN '2'
--          WHEN AC.PRODUCT_CODE = 'NMEP_Course2' THEN '3'
--          WHEN AC.PRODUCT_CODE = 'NMEP_Course3' THEN '4'
--          WHEN AC.PRODUCT_CODE = 'NMEP_Course4' THEN '5'
--          WHEN AC.PRODUCT_CODE = 'NMEP_Course5' THEN '6'
--          WHEN AC.PRODUCT_CODE = 'NMEP_Course6' THEN '7'
--          WHEN AC.PRODUCT_CODE = 'NMEP_Course7' THEN '8'
--      END AS 'COLUMN_ORDER'
    FROM NAME N
        JOIN USERMAIN UM
        ON N.ID = UM.CONTACTMASTER
        JOIN formTransLog TL
        ON UM.USERID = TL.USERNAME
        JOIN anet_Users AU
        ON UM.USERID = AU.USERNAME
        JOIN anet_Membership AM
        ON AU.USERID = AM.USERID
        JOIN ACTIVITY AC
        ON N.ID = AC.ID
        AND AC.ACTIVITY_TYPE = 'COURSE'
        AND AC.PRODUCT_CODE LIKE 'N%'
--ORDER BY 1, 7

DECLARE @sql AS varchar(max)
DECLARE @pivot_list AS varchar(max) -- Leave NULL for COALESCE technique
DECLARE @select_list AS varchar(max) -- Leave NULL for COALESCE technique

SELECT @pivot_list = COALESCE(@pivot_list + ', ', '') + '[' + CONVERT(varchar, PIVOT_CODE) + ']'
        ,@select_list = COALESCE(@select_list + ', ', '') + '[' + CONVERT(varchar, PIVOT_CODE) + '] AS [col_' + CONVERT(varchar, PIVOT_CODE) + ']'
FROM (
    SELECT DISTINCT PIVOT_CODE
    FROM (
        SELECT TEST, ED, ROW_NUMBER() OVER (PARTITION BY TEST ORDER BY ED) AS PIVOT_CODE
        FROM #tmp
    ) AS rows
) AS PIVOT_CODES

SET @sql = '
;WITH p AS (
    SELECT TEST, ED, ROW_NUMBER() OVER (PARTITION BY TEST ORDER BY ED) AS PIVOT_CODE
    FROM #tmp
)
SELECT TEST, ' + @select_list + '
FROM p
PIVOT (
    MIN(ED)
    FOR PIVOT_CODE IN (
        ' + @pivot_list + '
    )
) AS pvt
'

PRINT @sql

EXEC (@sql)

编辑: 目标是让 SSRS 中的报告如下所示:

【问题讨论】:

  • 您能否展示您正在寻找的示例布局?

标签: sql sql-server-2005 reporting-services reportingservices-2005


【解决方案1】:

我能够通过在 PIVOT 运算符下方的查询中添加一个数字 (RowNum) 来生成您正在寻找的结果。它不必在最终查询中(尽管您可能希望它用于客户端排序),但是通过将它放在底层,PIVOT 操作将该数字视为 GROUP BY 子句的成员。

请查看下面我的示例 SQL,如果这符合您的条件,请告诉我。

CREATE TABLE #TMP
  (
    Name VARCHAR(10),
    Test VARCHAR(20),
    EffectiveDate DATETIME
  )
INSERT INTO #TMP (Name, Test, EffectiveDate)
SELECT 'Jane', 'NM_Course1', '01/17/2014' UNION
SELECT 'Jane', 'NMEP_Course1', '12/19/2013' UNION
SELECT 'Jane', 'NMEP_Course1', '12/20/2013' UNION
SELECT 'Jane', 'NMEP_Course2', '12/19/2013' UNION
SELECT 'Jane', 'NMEP_Course2', '12/22/2013' UNION
SELECT 'Jane', 'NMEP_Course2', '01/05/2014' UNION
SELECT 'John', 'NM_Course1', '01/17/2014' UNION
SELECT 'John', 'NMEP_Course1', '01/11/2014' 



DECLARE @sql AS varchar(max)
DECLARE @pivot_list AS varchar(max) -- Leave NULL for COALESCE technique
DECLARE @select_list AS varchar(max) -- Leave NULL for COALESCE technique

SELECT @pivot_list = COALESCE(@pivot_list + ', ', '') + '[' + CONVERT(varchar, PIVOT_CODE) + ']'
        ,@select_list = COALESCE(@select_list + ', ', '') + '[' + CONVERT(varchar, PIVOT_CODE) + '] AS [col_' + CONVERT(varchar, PIVOT_CODE) + ']'
FROM (
    SELECT DISTINCT PIVOT_CODE
    FROM (
        SELECT TEST AS PIVOT_CODE
        FROM #tmp
    ) AS rows
) AS PIVOT_CODES

SET @sql = '
SELECT Name, ' + @select_list + '
FROM 
  (
    SELECT b.Name, RowNum, b.EffectiveDate, b.TEST AS PIVOT_CODE
    FROM 
          (
            SELECT Name, Test, EffectiveDate, ROW_NUMBER() OVER (PARTITION BY NAME, TEST ORDER BY EffectiveDate) RowNum 
            FROM #Tmp
          ) b
  ) p
PIVOT (
    MIN(EffectiveDate)
    FOR PIVOT_CODE IN (
        ' + @pivot_list + '
    )
) AS pvt
ORDER BY Name, RowNum
'


PRINT @sql

EXEC (@sql)


DROP TABLE #TMP 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-05
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    相关资源
    最近更新 更多