2

有人可以就如何将分配表转换为目标表给我一些帮助:

分配

SA    Project         From            TO        Allocation      Comment
-------------------------------------------------------------------------------
Bin     p1          2008-11-01     2008-11-30       0.3            a
Bin     p1          2008-12-01     2008-12-31       0.3            a
Bin     p1          2009-01-01     2009-01-31       0.3            a
Bin     p1          2012-09-01     2012-09-30       0.5            b
Bin     p1          2012-10-01     2012-10-31       0.5            b
Bin     p1          2012-11-01     2012-11-30       0.5            b
Bin     p1          2012-12-01     2012-12-31       0.5            b
Mike    p2          2011-09-01     2011-09-30       0.3            c
Mike    p2          2011-10-01     2011-10-31       0.3            c
Mike    p2          2011-11-01     2011-11-30       0.3            c
Mike    p2          2011-12-01     2011-12-31       0.3            c
Mike    p2          2012-01-01     2012-01-31       0.3            c
Mike    p2          2012-05-01     2012-05-31       0.6            c
Mike    p2          2012-06-01     2012-06-30       0.6            c
Mike    p2          2012-07-01     2012-07-31       0.6            c
Mike    p1          2011-10-01     2011-10-31       0.45           d
Mike    p1          2011-11-01     2011-11-30       0.45           d
Mike    p1          2011-12-01     2011-12-31       0.45           d
Mike    p1          2012-10-01     2012-10-31       0.32           d
Mike    p1          2012-11-01     2012-11-30       0.32           d
Mike    p1          2012-12-01     2012-12-31       0.32           d

==================================================== ===============================

目标

请注意,11 月 12 月是上一年的 1 月 2 月 ... 10 月。

SA  Project Year  Nov  Dec  Jan Feb Mar Apr May  Jun  Jul  Aug  Sep  Oct Comment Total  
---------------------------------------------------------------------------------------
Bin   p1    2008  0.3  0.3  0.3  0   0   0   0    0    0    0    0    0     a     0.9
Bin   p1    2011   0    0    0   0   0   0   0    0    0    0   0.5  0.5    b      1
Bin   p1    2012  0.5  0.5   0   0   0   0   0    0    0    0    0    0     b      1

Total             0.8  0.8  0.3  0   0   0   0    0    0    0   0.5  0.5          2.9

Mike  p1    2010   0    0    0   0   0   0   0    0    0    0    0   0.45   d     0.45
Mike  p1    2011  0.45 0.45  0   0   0   0   0    0    0    0    0   0.32   d     1.22
Mike  p1    2012  0.32 0.32  0   0   0   0   0    0    0    0    0    0     d     0.64
Mike  p2    2010   0    0    0   0   0   0   0    0    0    0   0.3  0.3    c     0.6
Mike  p2    2011  0.3  0.3  0.3  0   0   0  0.6  0.6  0.6   0    0    0     c     2.7

Total             1.07 1.07 0.3  0   0   0  0.6  0.6  0.6   0   0.3  1.07         5.61

现在我可以得到当前表:

当前

我只能在同一年制作一月二月...十二月。从去年11月开始,连续两年不知道怎么做。

SA  Project Year   Jan Feb Mar Apr  May  Jun  Jul   Aug  Sep   Oct    Nov  Dec  Comment
----------------------------------------------------------------------------------------
Bin   p1    2008    0   0   0   0    0    0    0     0    0     0    0.30  0.30   a
Bin   p1    2009  0.30  0   0   0    0    0    0     0    0     0      0    0     a
Bin   p1    2012    0   0   0   0    0    0    0     0   0.50  0.50  0.50  0.50   b
Mike  p1    2011    0   0   0   0    0    0    0     0    0    0.45  0.45  0.45   d
Mike  p1    2012    0   0   0   0    0    0    0     0    0    0.32  0.32  0.32   d
Mike  p2    2011    0   0   0   0    0    0    0     0   0.30  0.30  0.30  0.30   c
Mike  p2    2012  0.30  0   0   0  0.60  0.60  0.60  0    0     0     0     0     c

关键问题是如何将当前表转换为目标表。在Target表中,例如 2008 Nov Dec 和 2009 Jan Feb Mar Apr May Jun Jul Aug Sep Oct 应显示在同一行中。此外,每列之和和每行之和也应相加。

欢迎任何建议。

如果有人可以帮助我实现这一目标,将不胜感激。

提前谢谢。

4

1 回答 1

0

这是完整的解决方案,您可以查看代码并在 SQLFiddle Demo 上查看,我将在代码下方进行简要说明。

SQLFiddle 演示

;WITH 
CTE_Pivot AS 
(
    SELECT 
         SA
        ,Project
        ,CASE WHEN MONTH([FROM]) <11 THEN YEAR([FROM])-1 ELSE YEAR([From]) END AS YEAR
        ,CASE WHEN MONTH([FROM]) = 11 THEN Allocation ELSE 0 END AS Nov
        ,CASE WHEN MONTH([FROM]) = 12 THEN Allocation ELSE 0 END AS [Dec]
        ,CASE WHEN MONTH([FROM]) = 1 THEN Allocation ELSE 0 END AS Jan
        ,CASE WHEN MONTH([FROM]) = 2 THEN Allocation ELSE 0 END AS Feb
        ,CASE WHEN MONTH([FROM]) = 3 THEN Allocation ELSE 0 END AS Mar
        ,CASE WHEN MONTH([FROM]) = 4 THEN Allocation ELSE 0 END AS Apr
        ,CASE WHEN MONTH([FROM]) = 5 THEN Allocation ELSE 0 END AS May
        ,CASE WHEN MONTH([FROM]) = 6 THEN Allocation ELSE 0 END AS Jun
        ,CASE WHEN MONTH([FROM]) = 7 THEN Allocation ELSE 0 END AS Jul
        ,CASE WHEN MONTH([FROM]) = 8 THEN Allocation ELSE 0 END AS Aug
        ,CASE WHEN MONTH([FROM]) = 9 THEN Allocation ELSE 0 END AS Sep
        ,CASE WHEN MONTH([FROM]) = 10 THEN Allocation ELSE 0 END AS Oct
        ,Allocation
        ,Comment
    FROM dbo.Allocation
)
,CTE_Rollup AS 
(
    SELECT SA, Project, YEAR 
        ,SUM(Nov) AS Nov
        ,SUM(Dec) AS Dec
        ,SUM(Jan) AS Jan
        ,SUM(Feb) AS Feb
        ,SUM(Mar) AS Mar
        ,SUM(Apr) AS Apr
        ,SUM(May) AS May
        ,SUM(Jun) AS Jun
        ,SUM(Jul) AS Jul
        ,SUM(Aug) AS Aug
        ,SUM(Sep) AS Sep
        ,SUM(Oct) AS Oct
        ,MAX(Comment) AS Comment
        ,SUM(Allocation) AS Total
    FROM CTE_Pivot 
    GROUP BY SA, Project, YEAR WITH ROLLUP
)
SELECT  
     CASE WHEN YEAR IS NULL THEN 'Total' ELSE SA END AS SA
    ,CASE WHEN YEAR IS NULL THEN NULL ELSE Project END AS Project
    ,YEAR 
    ,Nov,Dec,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct
    ,CASE WHEN YEAR IS NULL THEN NULL ELSE Comment END AS Comment
    ,Total 
FROM CTE_Rollup
WHERE SA IS NOT NULL AND (YEAR IS NOT NULL OR YEAR IS NULL AND Project IS NULL) 

首先 CTE 是对数据进行透视并创建列 Nov、Dec 等。此处的数据仍未分组。每个原始行都有一个单独的行,其中只有一个月的值和其他月的零。使用简单的 CASE 语句(当月<11 时,年 + 1)实现将 1 月至 10 月置于明年。

第二个 CTE 是对数据进行分组并使用 WITH ROLLUP 提示创建小计。它几乎可以返回您想要的内容,只有几行额外的行(每个 SA、项目组合、每个 SA 和总计的小计)。

最终查询只是消除这些行并格式化少数行和列以匹配您的目标表。

请注意,我手头没有 SQL Server 2005 来测试它,但我几乎肯定它应该可以正常工作

编辑:SQLFiddle 用于更新版本,总计前后有空白行

于 2013-04-16T08:10:38.007 回答