这是一种无需求助于 PIVOT 和动态 SQL 的简单方法:
DECLARE @Employee table ( empid int, empname varchar(50), id int IDENTITY(1,1) );
INSERT INTO @Employee VALUES
( 1000, 'Bill Gates' ), ( 1001, 'Elon Musk' );
DECLARE @EmpSales table ( empid int, bill_date date, sale int );
INSERT INTO @EmpSales VALUES
( 1000, '01/01/2020', 100 ), ( 1000, '01/15/2020', 100 ), ( 1000, '02/15/2020', 50 ), ( 1000, '04/01/2020', 25 );
SELECT
e.empid, e.empname, s.*
FROM @Employee e
OUTER APPLY (
SELECT
ISNULL( SUM( CASE WHEN DATENAME( month, n.bill_date ) = 'January' THEN n.sale ELSE 0 END ), 0 ) AS [Jan],
ISNULL( SUM( CASE WHEN DATENAME( month, n.bill_date ) = 'February' THEN n.sale ELSE 0 END ), 0 ) AS [Feb],
ISNULL( SUM( CASE WHEN DATENAME( month, n.bill_date ) = 'March' THEN n.sale ELSE 0 END ), 0 ) AS [Mar],
ISNULL( SUM( CASE WHEN DATENAME( month, n.bill_date ) = 'April' THEN n.sale ELSE 0 END ), 0 ) AS [Apr],
ISNULL( SUM( CASE WHEN DATENAME( month, n.bill_date ) = 'May' THEN n.sale ELSE 0 END ), 0 ) AS [May],
ISNULL( SUM( CASE WHEN DATENAME( month, n.bill_date ) = 'June' THEN n.sale ELSE 0 END ), 0 ) AS [Jun],
ISNULL( SUM( CASE WHEN DATENAME( month, n.bill_date ) = 'July' THEN n.sale ELSE 0 END ), 0 ) AS [Jul],
ISNULL( SUM( CASE WHEN DATENAME( month, n.bill_date ) = 'August' THEN n.sale ELSE 0 END ), 0 ) AS [Aug],
ISNULL( SUM( CASE WHEN DATENAME( month, n.bill_date ) = 'September' THEN n.sale ELSE 0 END ), 0 ) AS [Sep],
ISNULL( SUM( CASE WHEN DATENAME( month, n.bill_date ) = 'October' THEN n.sale ELSE 0 END ), 0 ) AS [Oct],
ISNULL( SUM( CASE WHEN DATENAME( month, n.bill_date ) = 'November' THEN n.sale ELSE 0 END ), 0 ) AS [Nov],
ISNULL( SUM( CASE WHEN DATENAME( month, n.bill_date ) = 'December' THEN n.sale ELSE 0 END ), 0 ) AS [Dec]
FROM @EmpSales AS n
WHERE
n.empid = e.empid
AND YEAR( n.bill_date ) = YEAR( GETDATE() )
) AS s
ORDER BY
e.empid;
返回
+-------+------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| empid | empname | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec |
+-------+------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 1000 | Bill Gates | 200 | 50 | 0 | 25 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1001 | Elon Musk | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+-------+------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+