피봇을 변경하는 동안 데이터의 유형(동적)

0

질문

말하자 나는 3 테이블:사용자 customattributes 및 customattributevalues. 최종 사용자 사용할 수 있는 사용자 정의 속성을 추가하려면 선택하여 이름과 형식에 대한 특성과 편집에 대한 값이 사용자가 없습니다.

여기 내용:

id 이름 lastname 활성 datecreated 사용자 이름 이메일
3 Ellen 1 3/25/2235 78439 [email protected]
5 Johnny 리코 1 4/16/2675 Roughneck31 [email protected]

customattributes(추가될 수 있는 언제든지)

id fullname 재검 유형
1 량 날짜 hiredate 날짜
2 직원 ID eeid int
3 관리자 관리자 이며(50)
4 에 할당된 선박 assignedship 이며(50)
5 직위 직함 이며(50)

종 현재로 이며 데이터 형식.

customattributevalues(수 있는 언제든지 편집)

id attributeid userid
1 1 3 2335-03-25
2 2 3 78439
3 3 3 Burke,카터
4 4 3 Sulaco
5 5 3 컨설턴트
6 1 5 2675-04-16
7 2 5 78440
8 3 5 LT Rasczak
9 4 5 로저 젊
10 5 5 Private

값을 나는 현재로 sql_variant 데이터 형식

그래서 여기에 제 질문:수 있는 방법을 보여주는 보고서를 만들은 모든 직원 및 그들의 특성,1 행당 직원은 모르고,얼마나 많은 사용자 지정 특성이 있다 그리고 그 결정적으로,내가 원하는 명시적으로 각각 변하는 열이 올바른 데이터의 유형

원하는 출력:

이름 lastname datecreated 사용자 이름 이메일 량 날짜 직원 ID 관리자 에 할당된 선박 직위
Ellen 2235-03-25 78439 [email protected] 2335-03-25 78439 Burke,카터 Sulaco 컨설턴트
리코 2675-04-16 Roughneck31 [email protected] 2675-04-16 78440 LT Rasczak 로저 젊 Private

나는 이미 배운 것을 동적 열 헤더를 사용하여 동적 쿼리,그러나 그것은 유형을 변환하는 것은 탈출하는 나입니다.

나는 적응하 는 이 솔루션을 위한 사용자 정의 필드는,하지만 제한하는 이 솔루션을 알고 있어야 각 사용자 정의 필드를 입력 변환입니다.

여기에 내가 무엇을 시도했다. 내가 가지고 올바른 출력을 제외한 형식 변환.

쿼리:

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 나 true/false
John Cappelletti

나는 익숙하지 않은 true/false opton-나는 그들이 항상 1/0
Tristen Hannah

@TristenHannah 당신이 올바른지에 대한 1/0. 난 명확하지 않았는 방법에 대한 당신이 그들을 저장. 당신은 말하는 try_convert(비트 값)을 작동하지 않는 이유는 무엇입니까?
John Cappelletti

그것은 최대 운영하지 않는 작업,그리고 내가 이해입니다 모든 집계 연산자 가 작동하지 않습니다. 그러나 아무 이유 없이 절망,나는 디자인할 수 있습니다 주위에 허용하지 않는 비트 데이터 유형이 있습니다.
Tristen Hannah

이 솔루션을 작동하는 것 같이 비트 데이터 형식을 수정하여 동적을 선택하는 선택 concat(',',로써 발생(fullname),'=try_convert('유형',MAX(는 경우 attributeid=',id,'다음 값 END))')(네 번째 라인 솔루션에)
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ý
..................................................................................................................