धुरी बदल रहा है, जबकि डेटा प्रकार (गतिशील)

0

सवाल

चलो कहते हैं मैं 3 टेबल: उपयोगकर्ताओं ग ustom एक, और customattributevalues. अंत उपयोगकर्ता जोड़ सकते हैं कस्टम विशेषताओं का चयन करके एक नाम और प्रकार के लिए विशेषता है, और मान संपादित करें किसी भी उपयोगकर्ता के लिए.

यहाँ मेरे उपयोगकर्ता:

आईडी firstname अंतिम नाम सक्रिय datecreated उपयोगकर्ता नाम ईमेल
3 एलेन Ripley 1 3/25/2235 78439 [email protected]
5 जॉनी रिको 1 4/16/2675 Roughneck31 [email protected]

ग ustom एक (कर सकते हैं जोड़ा जा करने के लिए किसी भी समय)

आईडी fullname uniquename प्रकार
1 किराए की तारीख hiredate तारीख
2 कर्मचारी आईडी eeid int
3 पर्यवेक्षक पर्यवेक्षक nvarchar(50)
4 सौंपा जहाज assignedship nvarchar(50)
5 नौकरी शीर्षक jobtitle nvarchar(50)

प्रकार मैं वर्तमान में है के रूप में sysname डेटा प्रकार.

customattributevalues (संपादित किया जा सकता है किसी भी समय)

आईडी attributeid userid मूल्य
1 1 3 2335-03-25
2 2 3 78439
3 3 3 बर्क, कार्टर
4 4 3 Sulaco
5 5 3 सलाहकार
6 1 5 2675-04-16
7 2 5 78440
8 3 5 लेफ्टिनेंट Rasczak
9 4 5 Rodger युवा
10 5 5 निजी

मूल्य मैं वर्तमान में है के रूप में sql_variant डेटा प्रकार

तो यहाँ मेरा सवाल है: मैं कैसे कर सकते हैं बनाने के लिए एक रिपोर्ट से पता चलता है कि सभी कर्मचारियों और उनके गुण, 1 लाइन प्रति कर्मचारी कैसे जानने के बिना, कई कस्टम विशेषताओं, वहाँ रहे हैं-और - महत्वपूर्ण बात, मैं करने के लिए चाहते हैं स्पष्ट रूप से परिवर्तित करने के लिए प्रत्येक स्तंभ सही डेटा प्रकार

वांछित आउटपुट:

firstname अंतिम नाम datecreated उपयोगकर्ता नाम ईमेल किराए की तारीख कर्मचारी आईडी पर्यवेक्षक सौंपा जहाज नौकरी शीर्षक
एलेन Ripley 2235-03-25 78439 [email protected] 2335-03-25 78439 बर्क, कार्टर Sulaco सलाहकार
Johnnie रिको 2675-04-16 Roughneck31 [email protected] 2675-04-16 78440 लेफ्टिनेंट Rasczak Rodger युवा निजी

मैं पहले से ही सीखा है क्या करने के लिए गतिशील कॉलम हेडर का उपयोग कर गतिशील क्वेरी, लेकिन यह प्रकार है कि रूपांतरण से बचने के है ।

मैं हूँ आदत डाल इस समाधान के लिए कस्टम क्षेत्रों, लेकिन सीमा के लिए इस समाधान है, आप प्रत्येक पता करने के लिए कस्टम फ़ील्ड बनाने के लिए प्रकार रूपांतरण ।

यहाँ है क्या मैंने कोशिश की है. मैं सही उत्पादन के लिए छोड़कर, प्रकार रूपांतरण.

क्वेरी:

DECLARE @columns NVARCHAR(MAX) = '';
DECLARE @sqlcmd NVARCHAR(MAX) = '';

SELECT @columns += QUOTENAME(fullname) + ','
FROM customattributesx ca

ORDER BY ca.id;

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

--PRINT @columns;

SET @sqlcmd = '
SELECT * FROM (
    SELECT userid
        ,firstname
        ,lastname
        ,datecreated
        ,username
        ,email
        ,fullname
        ,value
    FROM (
        SELECT u.id as userid
              ,u.firstname
              ,u.lastname
              ,u.datecreated
              ,u.username
              ,u.email
              ,ca.id
              ,ca.fullname as fullname
              ,ca.uniquename
              ,ca.type
              ,cav.value as value
        FROM dbo.users u
        CROSS JOIN customattributesx ca
        INNER JOIN customattributevaluesx cav
            ON cav.attributeid = ca.id AND cav.userid = u.id

        --ORDER BY u.id asc, ca.id asc
    ) t1
) t2
PIVOT (
    MIN(value)
    FOR fullname IN ('+@columns+')
) as pivottable
';
--print @sqlcmd
EXECUTE (@sqlcmd)

टेबल बनाने:

USE [CTMS]
GO

/****** Object:  Table [dbo].[users]    Script Date: 11/24/2021 9:29:16 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE IF NOT EXISTS [dbo].[users](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [firstname] [nvarchar](max) NULL,
    [lastname] [nvarchar](max) NULL,
    [active] [bit] NOT NULL,
    [datecreated] [datetime2](7) NOT NULL,
    [username] [nvarchar](256) NULL,
    [email] [nvarchar](256) NULL,
    [emailconfirmed] [bit] NOT NULL,
    [passwordhash] [nvarchar](max) NULL,
    [twofactorenabled] [bit] NOT NULL,
    [lockoutend] [datetimeoffset](7) NULL,
    [eockoutenabled] [bit] NOT NULL,
    [accessfailedcount] [int] NOT NULL,
    [qrcode] [nvarchar](50) NULL,
 CONSTRAINT [PK_id] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY],
 CONSTRAINT [uk_email] UNIQUE NONCLUSTERED 
(
    [email] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY],
 CONSTRAINT [uk_qrcode] UNIQUE NONCLUSTERED 
(
    [qrcode] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY],
 CONSTRAINT [uk_username] UNIQUE NONCLUSTERED 
(
    [username] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

ALTER TABLE [dbo].[users] ADD  DEFAULT (getutcdate()) FOR [datecreated]
GO


USE [CTMS]
GO

/****** Object:  Table [dbo].[customattributesx]    Script Date: 11/24/2021 9:31:09 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE IF NOT EXISTS [dbo].[customattributesx](
    [id] [smallint] IDENTITY(1,1) NOT NULL,
    [fullname] [nvarchar](50) NOT NULL,
    [uniquename] [nvarchar](50) NOT NULL,
    [type] [sysname] NOT NULL,
 CONSTRAINT [PK_customattributesx] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY],
 CONSTRAINT [uk1_customattributesx] UNIQUE NONCLUSTERED 
(
    [uniquename] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

USE [CTMS]
GO

/****** Object:  Table [dbo].[customattributevaluesx]    Script Date: 11/24/2021 9:31:27 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE IF NOT EXISTS [dbo].[customattributevaluesx](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [attributeid] [smallint] NOT NULL,
    [userid] [int] NOT NULL,
    [value] [sql_variant] NOT NULL,
 CONSTRAINT [PK_customattributevaluesx] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY],
 CONSTRAINT [uk1_customattributevaluesx] UNIQUE NONCLUSTERED 
(
    [attributeid] ASC,
    [userid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[customattributevaluesx]  WITH CHECK ADD  CONSTRAINT [fk1_customattributesvaluesx] FOREIGN KEY([attributeid])
REFERENCES [dbo].[customattributesx] ([id])
GO

ALTER TABLE [dbo].[customattributevaluesx] CHECK CONSTRAINT [fk1_customattributesvaluesx]
GO

ALTER TABLE [dbo].[customattributevaluesx]  WITH CHECK ADD  CONSTRAINT [fk2_customattributesvaluesx] FOREIGN KEY([userid])
REFERENCES [dbo].[users] ([id])
GO

ALTER TABLE [dbo].[customattributevaluesx] CHECK CONSTRAINT [fk2_customattributesvaluesx]
GO
dynamic pivot sql sql-server
2021-11-24 02:40:38
2

सबसे अच्छा जवाब

2

यदि आप कनवर्ट करना चाहिए डेटा प्रकार (वास्तव में एक प्रस्तुति परत बात है), तो एक गतिशील सशर्त एकत्रीकरण चाल करना चाहिए.

उदाहरण

Declare @SQL nvarchar(max) ='
Select U.*' +
(
Select concat(',',quotename(fullname),'=max(case when attributeid=',id,' then try_convert(',type,',value) end)')
 From customattributes
 For XML Path ('')
)+'
 From  users U
 Join  customattributesvalues V on U.ID=V.userid
 Group By U.ID
         ,U.FirstName
         ,U.LastName
         ,U.active
         ,U.datecreated
         ,U.username
         ,U.email
'
--print @SQL
Exec(@SQL)

परिणाम

enter image description here

उत्पन्न SQL इस तरह दिखता है

Select U.*
      ,[Hire Date]=max(case when attributeid=1 then try_convert(date,value) end)
      ,[Employee ID]=max(case when attributeid=2 then try_convert(int,value) end)
      ,[Supervisor]=max(case when attributeid=3 then try_convert(nvarchar(50),value) end)
      ,[Assigned Ship]=max(case when attributeid=4 then try_convert(nvarchar(50),value) end)
      ,[Job Title]=max(case when attributeid=5 then try_convert(nvarchar(50),value) end)
 From  #users U
 Join  #customattributesvalues V on U.ID=V.userid
 Group By U.ID
         ,U.FirstName
         ,U.LastName
         ,U.active
         ,U.datecreated
         ,U.username
         ,U.email
2021-11-24 05:15:54

बहुत खूब! वहाँ एक तरीका है करने के लिए इस संशोधित इतना सा प्रकार इस्तेमाल किया जा सकता है? मुझे लगता है कि मैं कर सकते हैं के साथ दूर चले जाओ नहीं की अनुमति सा प्रकार है, लेकिन की तरह होता है को अधिकतम करने के लिए लचीलापन यदि संभव हो तो.
Tristen Hannah

@TristenHannah निर्भर करता है । कैसे खरगोश बिट्स संग्रहित किया जा रहा में मूल्यों की मेज? 1/0 या सही/गलत
John Cappelletti

मैं कर रहा हूँ के साथ अपरिचित सही/गलत opton - मैंने सोचा था कि वे थे हमेशा से 1/0
Tristen Hannah

@TristenHannah आप सही कर रहे हैं के बारे में 1/0. मैं था स्पष्ट नहीं तुम कैसे थे पर उन्हें भंडारण. आप कह रहे हैं try_convert(बिट,मूल्य) काम नहीं करता है?
John Cappelletti

यह अधिकतम ऑपरेटर है कि काम नहीं करता है, और मेरी समझ है, सभी सकल ऑपरेटरों काम नहीं करेगा. हालांकि, कोई कारण नहीं निराशा करने के लिए, मुझे लगता है कि मैं डिजाइन कर सकते हैं चारों ओर की अनुमति नहीं दे बिट डेटा प्रकार के ।
Tristen Hannah

इस समाधान करने के लिए लगता है के साथ काम बिट डेटा प्रकार बस को संशोधित करने के लिए गतिशील का चयन करने के लिए: का चयन concat(',',quotename(fullname),'=try_convert(',प्रकार,'मैक्स(केस जब attributeid=',आईडी,' तो मान अंत))') (चौथी लाइन में समाधान)
Tristen Hannah

@TristenHannah अच्छी तरह से किया!
John Cappelletti
0

SQL_VARIANT हो सकता है कास्ट करने के लिए एक गंतव्य डेटा प्रकार है ।

के भाग को संशोधित गतिशील क्वेरी जहां आप उत्पन्न स्तंभ सूची उत्पन्न करने के लिए, दो सूचियों. एक सूची के लिए है PIVOT हिस्सा है और अन्य के लिए SELECT हिस्सा है जहां आप आप डाली डेटा प्रकार है ।

उदाहरण पर आधारित है लेख में आप का उल्लेख करने के लिए अपने प्रश्न में:

DECLARE @PivotList NVARCHAR( MAX )
DECLARE @SelectList NVARCHAR( MAX )
SELECT @SelectList = NULL, @PivotList = NULL
        -- Column list with CAST e.g. CAST( eeid AS INT ) AS eeid
        -- Data types come from your customattributes table
SELECT @SelectList = COALESCE( @SelectList + ',','') + 'CAST( ' + uniquename + ' AS [type] ) AS ' + uniquename,
        -- Just a column list that goes into PIVOT operator
        @PivotList = COALESCE( @PivotList + ',','') + uniquename
-- Your tables for attribute values and attribute type definitions
FROM customattributes AS ca

DECLARE @SQLQuery NVARCHAR(MAX)
SET @SQLQuery =

'SELECT StudID , '+@SelectList+'
FROM
( SELECT SM.StudID, S.SubjectName, SM.Score 
FROM StudentMarks SM 
INNER JOIN Subjects S
ON Sm.SubjectID = S.SubjectID
) AS tbl
PIVOT 
( Sum(Score)
FOR SubjectName IN ('+@PivotList+') ) as pvt'

EXEC(@SQLQuery)
2021-11-24 04:41:32

हाय, मुझे का पालन करें SelectList और PivotList, लेकिन SQL क्वेरी ही लगता है कि किया जा करने के लिए संदर्भित अन्य तालिकाओं शामिल नहीं है । फिर भी, मैं देख जहां यह जा रहा है और मुझे लगता है कि मैं का उपयोग कर सकते हैं के रूप में अवधारणा के लिए एक संभव समाधान है!
Tristen Hannah

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में