Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर 2005 में PIVOT का उपयोग कैसे करें संग्रहीत कार्यविधि दो दृश्यों में शामिल होना

आपको PIVOT द्वारा सभी संभावित मानों को जानना होगा। इसलिए इसे सीधे टी-एसक्यूएल के साथ करना मुश्किल है जब तक कि आप डायनेमिक एसक्यूएल का उपयोग नहीं करते हैं और यह बहुत जल्दी बालों वाला हो सकता है। शायद सभी पंक्तियों को प्रस्तुतिकरण स्तर या रिपोर्ट लेखक को पास करना और उन्हें एक तरफ मोड़ने देना बेहतर है।

यदि आप सभी UBCategory मानों को पहले से जानते हैं, तो यहां एक त्वरित PIVOT उदाहरण दिया गया है। मैंने 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;

इसे और अधिक गतिशील बनाने के लिए, आपको DISTINCT 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 बना सकते हैं ... सीधे चयन के बजाय चयन करें। बेशक, यह एक तरह से बेकार लगता है, क्योंकि उस इंसर्ट स्टेटमेंट को लिखने के लिए, आपको कॉलम के क्रम को जानना होगा (जो इस दृष्टिकोण से गारंटीकृत नहीं है) और आपको पहले से ही प्रत्येक संभावित 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. अन्य उपयोगकर्ता द्वारा दी गई अनुमति को रद्द नहीं कर सकता

  2. गिनें, ऑर्डर करें और टॉप 5 चुनें

  3. SQL सर्वर कॉलम को पहचान कॉलम में कनवर्ट करता है

  4. युग टाइमस्टैम्प को sql सर्वर में परिवर्तित करना (मानव पठनीय प्रारूप)

  5. TableDiff . का उपयोग करने के बाद छोटी तालिका दिखाने वाले विषम वर्ण