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

Как да използвате PIVOT в SQL Server 2005 Съхранена процедура, обединяваща два изгледа

Трябва да знаете всички възможни стойности за PIVOT. Така че е трудно да се направи това с T-SQL директно, освен ако не използвате динамичен SQL и това може да стане космат доста бързо. Вероятно е по-добре да предадете всички редове обратно на нивото на представяне или на писателя на отчет и да ги оставите да ги обърне настрани.

Ето бърз пример за PIVOT, ако знаете всички стойности на UBCategory предварително. Пропуснах ICCUDays, тъй като изглежда доста без значение, освен ако няма колони, които идват от този изглед като част от резултата.

USE tempdb;
GO
SET NOCOUNT ON;
GO

-- who on earth is responsible for your naming scheme?
CREATE TABLE dbo.ICCUEnctrSelectedRevCatsDirCost
(
    Account INT,
    UBCategory VARCHAR(10),
    DirectCost DECIMAL(9,2)
);

INSERT dbo.ICCUEnctrSelectedRevCatsDirCost
    SELECT 1, 'foo', 5.25
    UNION SELECT 1, 'bar', 6.25
    UNION SELECT 1, 'smudge', 8.50
    UNION SELECT 2, 'foo', 9.25
    UNION SELECT 2, 'brap', 2.75;

SELECT Account,[foo],[bar],[smudge],[brap] FROM 
    dbo.ICCUEnctrSelectedRevCatsDirCost
    -- WHERE <something>, I assume ???
PIVOT
(
    MAX(DirectCost)
    FOR UBCategory IN ([foo],[bar],[smudge],[brap])
) AS p;

GO
DROP TABLE dbo.ICCUEnctrSelectedRevCatsDirCost;

За да направите това по-динамично, ще трябва да получите разделен със запетаи списък с ОТДЕЛНИ стойности на UBCategory и да изградите опорната точка в движение. Така че може да изглежда така:

USE tempdb;
GO
SET NOCOUNT ON;
GO

-- who on earth is responsible for your naming scheme?
CREATE TABLE dbo.ICCUEnctrSelectedRevCatsDirCost
(
    Account INT,
    UBCategory VARCHAR(10),
    DirectCost DECIMAL(9,2)
);

INSERT dbo.ICCUEnctrSelectedRevCatsDirCost
    SELECT 1, 'foo', 5.25
    UNION SELECT 1, 'bar', 6.25
    UNION SELECT 1, 'smudge', 8.50
    UNION SELECT 2, 'foo', 9.25
    UNION SELECT 2, 'brap', 2.75
    UNION SELECT 3, 'bingo', 4.00;

DECLARE @sql NVARCHAR(MAX),
    @col NVARCHAR(MAX);

SELECT @col = COALESCE(@col, '') + QUOTENAME(UBCategory) + ','
    FROM 
    (
        SELECT DISTINCT UBCategory
        FROM dbo.ICCUEnctrSelectedRevCatsDirCost
    ) AS x;

SET @col = LEFT(@col, LEN(@col)-1);

SET @sql = N'SELECT Account, $col$ FROM 
    dbo.ICCUEnctrSelectedRevCatsDirCost
    -- WHERE <something>, I assume ???
PIVOT
(
    MAX(DirectCost)
    FOR UBCategory IN ($col$)
) AS p;';

SET @sql = REPLACE(@sql, '$col$', @col);

--EXEC sp_executeSQL @sql;
PRINT @sql;

GO
DROP TABLE dbo.ICCUEnctrSelectedRevCatsDirCost;

След това, за да "изпратите данните в нова таблица", можете просто да направите заявката INSERT INTO ... SELECT вместо прав SELECT. Разбира се, това изглежда някак безполезно, защото, за да напишете този израз за вмъкване, трябва да знаете реда на колоните (което не е гарантирано с този подход) и трябва вече да сте поставили колони за всяка потенциална UBCategory стойност така или иначе, така че това изглежда много кокошка и яйце.




  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 SERVER:Вземете общия брой дни между две дати

  2. Получаване на връщана стойност в C# asp.net от съхранена процедура (проблем със синтаксиса)

  3. Проверете дали полето е числово, след което изпълнете сравнение само върху тези полета в един оператор?

  4. В SQL Server как да разбера какъв режим на транзакция използвам в момента?

  5. Премахване на дублиращи се редове (въз основа на стойности от множество колони) от SQL таблица