使用 ROLLUP:
这是一个包含几列的集合(仅限高级版)
SELECT
(CASE rno WHEN 1 THEN EndorsementId ELSE '' END )AS col1,
rno,
sum(PREMIUM)
FROM
(
SELECT
ROW_NUMBER() OVER(PARTITION BY EndorsementId ORDER BY PolicyNumber) AS rno,
*
FROM [endorsement]
) As temp1
GROUP by EndorsementId, rno
with rollup
结果:
| COL1 | RNO | COLUMN_2 |
|-------|--------|----------|
| 13519 | 1 | 750 |
| | 2 | 0 |
| | 3 | 0 |
| | (null) | 750 |
| 13524 | 1 | 157 |
| | 2 | 0 |
| | 3 | 158 |
| | 4 | 16 |
| | (null) | 331 |
. . . . . . .
SQL Fiddle
顺便说一句,Compute BY 可以达到相同的结果(它只是在 SQL Fiddle 中不起作用):
SELECT
(CASE rno WHEN 1 THEN EndorsementId ELSE '' END )AS col1,
rno,
PREMIUM
FROM
(
SELECT
ROW_NUMBER() OVER(PARTITION BY EndorsementId ORDER BY PolicyNumber) AS rno,
*
FROM [endorsement]
) As temp1
ORDER by EndorsementId, rno
COMPUTE SUM(Premium) BY EndorsementId
如果您无法忽略 ROLLUP 生成的最后一行,那么您可以使用以下语句生成包含组总计的所需结果。它有点长,但做得很好。 SQL Fiddle:
SELECT
(CASE rno WHEN 1 THEN EndorsementId WHEN 9999999999 THEN 'Total'ELSE '' END )AS [Endorsement ID],
(CASE rno WHEN 1 THEN PolicyNumber ELSE '' END )AS [Policy Number],
(CASE rno WHEN 1 THEN InsuredName ELSE '' END )AS [Insured Name],
(CASE rno WHEN 1 THEN [temp1].[EffectiveDate] ELSE '' END )AS [Effective Date],
(CASE rno WHEN 1 THEN [temp1].[ExpirationDate] ELSE '' END )AS [Expiration Date],
(CASE rno WHEN 1 THEN [temp1].[EndorsementNumber] ELSE '' END )AS [Endorsement Number],
(CASE rno WHEN 1 THEN [temp1].[EffectFromDate] ELSE '' END )AS [EffectFrom Date],
(CASE rno WHEN 1 THEN [temp1].[DueDate] ELSE '' END )AS [Due Date],
(CASE rno WHEN 1 THEN [temp1].[Producer] ELSE '' END )AS [Producer],
Premium,
Commission,
NetPremium AS [Net Premium]
FROM
(
SELECT
ROW_NUMBER() OVER(PARTITION BY EndorsementId ORDER BY PolicyNumber) AS rno,
*
FROM [endorsement]
UNION ALL
SELECT
9999999999 AS rno,
EndorsementId,
'',
'',
'',
'',
'',
'',
'',
'',
SUM(Premium) AS Premium,
SUM(Commission) AS Commission,
SUM(NetPremium) AS NetPremium
FROM [endorsement]
GROUP BY EndorsementId
) As temp1
ORDER BY EndorsementId, rno