Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Разменете някои редове в колони в SQL Server 2008

Може би нещо подобно:

Първо данните от теста:

CREATE TABLE #tbl (AccountManager VARCHAR(100), Action VARCHAR(100),Count INT)

INSERT INTO #tbl
VALUES
    ('Joe','Client Negotiation',10),
    ('Bloggs','Closing',1),
    ('Aunty','Email',12),
    ('Marie','Preparing Contract',32)

Ако знаете, че колоните са статични. Тогава можете да направите следното:

SELECT
    AccountManager,
    ISNULL([Client Negotiation],0) AS [Client Negotiation],
    ISNULL([Closing],0) AS [Closing],
    ISNULL([Email],0) AS [Email],
    ISNULL([Preparing Contract],0) AS [Preparing Contract]
FROM
(
SELECT
    tbl.AccountManager,
    tbl.Action,
    tbl.Count
FROM
    #tbl AS tbl
) AS p
PIVOT
(
    SUM([Count])
    FOR [Action] IN([Client Negotiation],[Closing],[Email],[Preparing Contract])
) AS pvt

В противен случай трябва да направите динамичен пивот като този:

Първо уникалните имена на колони:

DECLARE @cols VARCHAR(MAX),
        @colsWithIsNull VARCHAR(MAX)
;WITH CTE
AS
(
    SELECT
        ROW_Number() OVER(PARTITION BY tbl.Action ORDER BY tbl.Action) AS iRank,
        tbl.Action
    FROM
        #tbl AS tbl
)
SELECT  @cols = COALESCE(@cols + ','+QUOTENAME(Action),
                     QUOTENAME(Action)),
        @colsWithIsNull=COALESCE(@colsWithIsNull + ',ISNULL('+QUOTENAME(Action)+',0) AS '+QUOTENAME(Action),
                     'ISNULL('+QUOTENAME(Action)+',0) AS '+QUOTENAME(Action))
FROM
    CTE
WHERE
    iRank=1

След това динамичната опорна точка като тази:

DECLARE @query NVARCHAR(4000)=
N'SELECT
    AccountManager,
    '[email protected]+'
FROM
(
SELECT
    tbl.AccountManager,
    tbl.Action,
    tbl.Count
FROM
    #tbl AS tbl
) AS p
PIVOT
(
    SUM([Count])
    FOR [Action] IN('[email protected]+')
) AS pvt'

EXECUTE(@query)

Тогава в моя случай ще премахна временната таблица:

DROP TABLE #tbl


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Технологична йерархия на паметта/съхранението и SQL сървър

  2. списък, разделен със запетая, като единичен низ, T-SQL

  3. SQL Server AutoIncrement варира според стойността на друго поле

  4. Как да разрешим влизанията в Azure в Windows не се поддържат в тази версия на SQL Server?

  5. Заявката SELECT винаги ли връща редове в същия ред? Таблица с групиран индекс