Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara menggunakan PIVOT di SQL Server 2005 Stored Procedure Menggabungkan Dua Tampilan

Anda perlu mengetahui semua nilai yang mungkin untuk PIVOT. Jadi sulit untuk melakukan ini dengan T-SQL secara langsung kecuali jika Anda menggunakan SQL dinamis dan ini bisa cepat berbulu. Mungkin lebih baik meneruskan semua baris kembali ke tingkat presentasi atau penulis laporan dan membiarkannya berbelok ke samping.

Berikut adalah contoh PIVOT cepat jika Anda mengetahui semua nilai UBCategory sebelumnya. Saya meninggalkan ICCUDays karena tampaknya agak tidak relevan kecuali ada kolom yang berasal dari pandangan itu sebagai bagian dari hasil.

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;

Untuk membuat ini lebih dinamis, Anda harus mendapatkan daftar nilai DISTINCT UBCategory yang dipisahkan koma, dan membangun pivot dengan cepat. Jadi mungkin terlihat seperti ini:

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;

Kemudian untuk "mengirim data ke tabel baru" Anda bisa membuat kueri menjadi INSERT INTO ... SELECT alih-alih SELECT langsung. Tentu saja, ini sepertinya tidak berguna, karena untuk menulis pernyataan penyisipan itu, Anda perlu mengetahui urutan kolom (yang tidak dijamin dengan pendekatan ini) dan Anda harus sudah memasukkan kolom untuk setiap potensi UBCategory nilai, jadi ini terlihat sangat ayam dan telur.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana Anda mentransfer atau mengekspor data SQL Server 2005 ke Excel?

  2. jika kondisi dalam permintaan pembaruan server sql

  3. Migrasikan kolom DateTime SQL Server ke DateTimeOffset

  4. Haruskah Anda membuat beberapa panggilan penyisipan atau meneruskan XML?

  5. Tidak dapat terhubung ke localDB di VS2012 – Terjadi kesalahan terkait jaringan atau spesifik saat membuat koneksi ke SQL Server...