লাইক স্টেটমেন্টে পিভট করা কি সম্ভব?


9

COLUMN LIKE='Value%'কোনও PIVOTটেবিলে উপাদান দ্বারা গ্রুপ হিসাবে তৈরি করা সম্ভব (যেমন রয়েছে ) ? আমার একটি টেবিল রয়েছে [ডিবিটি] [[স্ট্যাটাস] যার বিভিন্ন স্ট্যাটাস রয়েছে (ডাটাবেসগুলি, উদাহরণস্বরূপ, ইত্যাদি) এবং সমস্ত পিআরডি এবং টেস্ট মানকে একক মান হিসাবে পাইভট / কোয়েরি করতে চান না, তবে তাদের গোষ্ঠীভুক্ত করুন।

যেমন পরিবর্তে স্থিতিগুলিকে জন্য কলাম থাকার Prod, Prod ACC, Prod APP, .. ইত্যাদি আমি শুধুমাত্র এক মান কলামে থাকবে Name LIKE 'Prod%'এবং Name LIKE 'Test%'

আমার এখন পর্যন্ত যা আছে:

সারণি সংজ্ঞা

CREATE TABLE [DBT].[Status](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Status] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY],
 CONSTRAINT [IX_Status] UNIQUE NONCLUSTERED 
(
    [Name] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]

GO

সারণীর মান

INSERT INTO [DBT].[Status]
(
    -- ID -- this column value is auto-generated
    Name
)
VALUES
('Test ACC'),
('Test APP'),
('Test DBA'),
('Prod ACC'),
('Prod APP'),
('Prod DBA'),
('Prod'),
('Test'),
('Migrated'),
('Offline'),
('Reserved')

পিভোটেড স্থিতি সারণী

SELECT 'Database Status' AS [DB Status], 
[1] AS [Test ACC], [2] AS [Test APP], [3] AS [Test DBA], [4] AS [Prod ACC], [5] AS [Prod APP], [6] AS [Prod DBA], [7] AS [Prod], [8] AS [Test], [9] AS [Migrated], [10] AS [Offline], [11] AS [Reserved] 
FROM 
(
    SELECT ID, Name  FROM [DBT].[Status]
) AS Source
PIVOT
(
    COUNT(Name) FOR ID IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11])
) AS PivotTable

আউটপুট এতদূর

DB Status       Test ACC    Test APP    Test DBA    Prod ACC    Prod APP    Prod DBA    Prod        Test        Migrated    Offline     Reserved
--------------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
Database Status 1           1           1           1           1           1           1           1           1           1           1

ডিবি <> বেহালার

Dbfiddle এতদূর।

প্রশ্ন

বিভিন্ন Test... এবং Prod....মানগুলির জন্য একাধিক সারি রাখার পরিবর্তে , আমি নীচের মতো করে তাদের গোষ্ঠীবদ্ধ করতে পছন্দ করব:

DB Status       | Test | Prod | Migrated | Offline | Reserved   
--------------- | ---- | ---- | -------- | ------- | --------
Database Status |    4 |    4 |        1 |       1 |        1

আমার প্রশ্ন সমাধানের উপায় সম্পর্কে আমার কোনও ধারণা নেই। (সত্য কথা বলতে গেলে আমি কেবল গতকাল বৃহত্তর পরীক্ষা এবং ত্রুটির পরে কেবল পিভটকেই ধরেছিলাম)।

এই প্রশ্নটি ইতিমধ্যে জিজ্ঞাসা করা একাধিক টেবিলের উপর গোষ্ঠীযুক্ত আইটেমগুলির যোগস / সংখ্যাগুলি কীভাবে তৈরি করা যায় সে প্রশ্নের সাথে is টেবিলগুলি [ডিবিটি] [[ইনস্ট্যান্স] এবং [ডিবিটি] [

উত্তর:


11

সমষ্টি (কেস

সীমিত সংখ্যক নামের জন্য আপনি একটি এসইএম (CASE সমাধান) এভাবে ব্যবহার করতে পারেন:

SELECT 
    'Database status' as [DB Status],
    SUM(CASE WHEN Name LIKE 'Test%' THEN 1 ELSE 0 END) As Test,
    SUM(CASE WHEN Name LIKE 'Prod%' THEN 1 ELSE 0 END) AS Prod,
    SUM(CASE WHEN Name = 'Migrated' THEN 1 ELSE 0 END) AS Migrated,
    SUM(CASE WHEN Name = 'Offline' THEN 1 ELSE 0 END) AS Offline,
    SUM(CASE WHEN Name = 'Reserved' THEN 1 ELSE 0 END) AS Reserved
FROM 
    [Status];

পিভট

যদি নামের একটি বিস্তৃত তালিকা থাকে তবে কেবলমাত্র কয়েকটিকেই আবার লিখতে হবে আপনি পিভট সমাধানটি বজায় রাখতে পারবেন:

SELECT 'Database Status' AS [DB Status],
[Test], [Prod], [Migrated], [Offline], [Reserved]
FROM
(
    SELECT 
        ID, 
        CASE
            WHEN Name LIKE 'Test%' THEN 'Test'
            WHEN Name LIKE 'Prod%' THEN 'Prod'
            ELSE Name
        END AS Name
    FROM 
        [Status]
) AS Source
PIVOT
(
    COUNT(ID) FOR Name IN ([Test], [Prod], [Migrated], [Offline], [Reserved])
) AS PivotTable;

ডিবি <> ফিডল এখানে

DYNAMIC QUERY

আপনি যদি কিছুটা অলস বোধ করেন এবং সমস্ত কলামের নাম লিখতে চান না, আপনি একটি গতিশীল কোয়েরি ব্যবহার করতে পারেন:

DECLARE @cols nvarchar(max);

SET @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(CASE WHEN Name LIKE 'Test%' THEN 'Test'
                                                    WHEN Name LIKE 'Prod%' THEN 'Prod'
                                                    ELSE Name END)
                   FROM [Status]
                   FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '');

DECLARE @cmd nvarchar(max);

SET @cmd = 
'SELECT ''Database Status'' AS [DB Status],' + @cols + ' FROM
    (SELECT 
        ID, 
        CASE
            WHEN Name LIKE ''Test%'' THEN ''Test''
            WHEN Name LIKE ''Prod%'' THEN ''Prod''
            ELSE Name
        END AS Name
    FROM 
        [Status]
) AS Source
PIVOT
(
    COUNT(ID) FOR Name IN (' + @cols + ')
) PVT'

EXEC(@cmd);

ডিবি <> ফিডল এখানে


7

আমি মনে করি আপনি এখানে দুটি পদক্ষেপের জন্য যে দুটি কার্য সম্পাদন করতে চাইছেন তা কঠোরভাবে আলাদা করা গুরুত্বপূর্ণ।

  1. শ্রেণীবিন্যাস
  2. রুপান্তর

ডেটা শ্রেণিবদ্ধ করার জন্য, আমার প্রবৃত্তিটি এখানে অভিভাবক শ্রেণীর কাছে রেকর্ডগুলি কঠোরভাবে ম্যাপ করার জন্য একটি সন্ধানের টেবিলের প্রস্তাব দেওয়া। যেমন

CREATE TABLE StatusType (
  ID     INT         IDENTITY PRIMARY KEY,
  [Name] VARCHAR(10) NOT NULL UNIQUE
);
GO
ALTER TABLE [Status] 
  ADD StatusTypeID INT NOT NULL 
    DEFAULT 1
    FOREIGN KEY REFERENCES StatusType (ID) ;

... যেখানে বীজ রেকর্ডটিতে StatusType( IDডিফল্টর জন্য = 1 Status.StatusTypeID) একটি স্থানধারক রেকর্ড যার নাম "অজানা" বা অনুরূপ।

যখন অনুসন্ধানের ডেটা সিড করা হয় এবং সঠিক কীগুলির সাহায্যে বেস রেকর্ডগুলি আপডেট করা হয়, তখন আপনি আপনার হৃদয়ের সামগ্রীতে সঞ্চার করতে পারেন।

select 'Database Status' AS [DB Status],
    [Test], [Prod], [Migrated], [Offline], [Reserved]
from (
    select s.ID,
           st.Name as StatusTypeName
    from status s
    join statusType st on st.ID = s.StatusTypeID
) as Source
pivot (
    count(ID) for StatusTypeName in ([Test],[Prod],[Migrated],[Offline],[Reserved],[Unknown])
) as pvt;

ফুল ডিবিফলল


আপনার সমাধানের জন্য আপনাকে ধন্যবাদ, এটি একটি খুব ভাল সমাধান। তবে আমি বর্তমানে বিদ্যমান সারণী সংজ্ঞা সংশোধন করতে বা ডাটাবেস ডিজাইনে যুক্ত করতে অক্ষম।
জন ওরফে হট 2

1
প্রথমে অস্থায়ী টেবিলের মধ্যে ডেটা নির্বাচন করুন, সেই উপায়ে আপনার উপর ডেটা নিয়ন্ত্রণ থাকবে। আপনি যদি চান তা প্রদর্শন করার জন্য এটি থেকে নির্বাচিত হওয়ার পরে লোভনীয়কে ফেলে দিন। একবার আপনার জিজ্ঞাসা হয়ে গেলে, আপনি এটিকে একটি সঞ্চিত পদ্ধতিতে বেক করতে পারেন যা স্বয়ংক্রিয়ভাবে লোভনীয় মধ্যে নির্বাচন করার এবং আপনার কাজ শেষ হয়ে যাওয়ার পরে নেমে যাওয়ার যত্ন নেয়।
খোলিয়াং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.