所以,每次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]
我指的这个, http://stackoverflow.com/questions/20632582/pivot-a-table-on-a-value-but- 20633609#20633609 – KumarHarsh