2

我有一个如下所示的表:

count  occupation  gender
800    engineer     M
400    engineer     F
700    doctor       M
100    doctor       F

我希望桌子看起来像

 Gender  engineer doctor
   M     800      700
   F     400      100

我怎样才能带来这种改变?

4

1 回答 1

2

试试这个——

询问:

DECLARE @temp TABLE
(
      [count] INT
    , occupation VARCHAR(20)
    , gender CHAR(1)
)

INSERT INTO @temp ([count], occupation, gender)
VALUES 
    (800, 'engineer', 'M'),
    (400, 'engineer', 'F'),
    (700, 'doctor', 'M'),
    (100, 'doctor', 'F')

SELECT *
FROM @temp
PIVOT 
(
    SUM([count]) 
    FOR occupation IN ([engineer], [doctor])
) p
ORDER BY gender DESC

输出:

gender engineer    doctor
------ ----------- -----------
M      800         700
F      400         100

更新#2:

询问:

IF OBJECT_ID (N'tempdb.dbo.#temp') IS NOT NULL
   DROP TABLE #temp

CREATE TABLE #temp
(
      [count] INT
    , occupation VARCHAR(20)
    , gender CHAR(1)
)

INSERT INTO #temp ([count], occupation, gender)
VALUES 
    (800, 'engineer', 'M'),
    (400, 'engineer', 'F'),
    (700, 'doctor', 'M'),
    (100, 'doctor', 'F'),
    (100, 'tester', 'F'),
    (100, 'programmer', 'M'),
    (100, 'programmer', 'F'),
    (100, 'programmer', 'M')

DECLARE @cols NVARCHAR(MAX)

SELECT @cols = STUFF((
    SELECT DISTINCT ', [' + occupation + ']'
    FROM #temp
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '')

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = '
    SELECT *
    FROM #temp
    PIVOT 
    (
        SUM([count]) 
        FOR occupation IN (' + @cols + ')
    ) p
    ORDER BY gender DESC'

PRINT @SQL
EXEC sys.sp_executesql @SQL

输出:

gender doctor      engineer    programmer  tester
------ ----------- ----------- ----------- -----------
M      700         800         200         NULL
F      100         400         100         100
于 2013-08-06T05:23:25.733 回答