2013-12-17 55 views
0

我造成这样转换行成多列

SubjectId ReasonId TypeId 

1   1   0 
1   1   0 
1   2   0 
1   2   0 
1   3   0 
1   4   1 
1   4   1 
1   6   1 
1   6   1 
2   1   0 
... 
... 
... 

但是,我要创建报告类似以下内容:

SubjectId ReasonId(Type0) Count(Type0) ReasonId(Type1) Count(Type1) 

1   1     2    4     2 
1   2     2    6     2 
1   3     1    5     0 
2   1     1    4     0 
2   2     0    5     0 
2   3     0    6     0 

让我解释一下:

而是显示结果标准视图中,每条记录都是新行,我必须将结果分为两组:

第一组已修复每SubjectId编辑三行,值为TypeId = 0,并且对于每个原因(1,2,3),我必须显示特定原因的行数。 ReasonId必须按行数降序排序。

第二组位于第一组右侧,故事相同,而不是TypeId = 0TypeId = 1。同样的降序是需要的。

因此,每个SubjectId对于每个ReasonId只有三行(对于类型0,原因1,2,3,对于类型1,原因4,5,6)。

如果某些学科有以任何理由任何行,我必须写0

+0

我指的这个, http://stackoverflow.com/questions/20632582/pivot-a-table-on-a-value-but- 20633609#20633609 – KumarHarsh

回答

0

所以,每次SubjectId正好有三排,每ReasonId(0 类型是有原因1,2,3对于类型1,有理由4, 5,6)。

这是db需要的关键信息。将这些规则编码到一个表中并交叉连接到您的数据表。

SELECT 
     [SubjectId], 
     [ReasonID(Type0)], 
     SUM(CASE WHEN [ReasonId] = [ReasonID(Type0)] THEN 1 ELSE 0 END) AS [Count(Type0)], 
     [ReasonID(Type1)], 
     SUM(CASE WHEN [ReasonId] = [ReasonID(Type1)] THEN 1 ELSE 0 END) AS [Count(Type1)] 
    FROM MyTable S 
    CROSS JOIN (VALUES (1,4),(2,5),(3,6)) X([ReasonID(Type0)],[ReasonID(Type1)]) 
    GROUP BY [SubjectId],[ReasonID(Type0)],[ReasonID(Type1)] 

要按各自独立的理由:

WITH SortedCounts AS (
    SELECT 
    S.[SubjectId],T.[TypeId],T.[ReasonId], 
    SUM(CASE WHEN S.[ReasonId] = T.[ReasonId] AND S.[TypeId] = T.[TypeId] THEN 1 ELSE 0 END) AS [Count], 
    ROW_NUMBER() OVER(
     PARTITION BY S.[SubjectId],T.[TypeId] 
     ORDER BY SUM(CASE WHEN S.[ReasonId] = T.[ReasonId] AND S.[TypeId] = T.[TypeId] THEN 1 ELSE 0 END) DESC, T.[ReasonId] ASC 
    ) [SortOrder] 
    FROM MyTable S 
    CROSS JOIN (VALUES(0,1),(0,2),(0,3),(1,4),(1,5),(1,6)) T([TypeId],[ReasonId]) 
    GROUP BY S.[SubjectId],T.[TypeId],T.[ReasonId] 
) 
SELECT 
    [SubjectId], 
    MIN(CASE WHEN [TypeId] = 0 THEN [ReasonId] END) AS [ReasonId(Type0)], 
    MIN(CASE WHEN [TypeId] = 0 THEN [Count] END) AS [Count(Type0)], 
    MIN(CASE WHEN [TypeId] = 1 THEN [ReasonId] END) AS [ReasonId(Type1)], 
    MIN(CASE WHEN [TypeId] = 1 THEN [Count] END) AS [Count(Type1)] 
FROM SortedCounts T 
GROUP BY [SubjectId],[SortOrder] 
ORDER BY [SubjectId],[SortOrder] 
+0

对于总是(1,4),(2,5),(3,6)的情况,这是可以的,但是当我声明,配对必须通过计数,而不是通过ID。例如:某处(1,4),但某处(1,5)或(1,6)等等... – veljasije

+1

然后,您需要将ROW_NUMBER()添加到计数中,然后将其包装在CTE所以你可以按它分组和排序。 – Anon