[SQL] SQL 동적 열 이름을 생성하는?
SQLSQL 동적 열 이름을 생성하는?
그래서 같은로서 '의 ColumnName'문을 내가 열 이름에 피벗 행 값을 시도하고 현재 내가 SUM (케이스 ...) 사용하고 쿼리를 가지고 :
SELECT
SKU1,
SUM(Case When Sku2=157 Then Quantity Else 0 End) As '157',
SUM(Case When Sku2=158 Then Quantity Else 0 End) As '158',
SUM(Case When Sku2=167 Then Quantity Else 0 End) As '167'
FROM
OrderDetailDeliveryReview
Group By
OrderShipToID,
DeliveryDate,
SKU1
위의 쿼리는 잘 작동하고 내가 필요 정확히 저를 제공합니다. 그러나, 나는이 SUM을 쓰고 있어요 (사례 ... 다음 쿼리의 결과에 따라 손으로 문 :
Select Distinct Sku2 From OrderDetailDeliveryReview
저장 프로 시저 내에서 T-SQL을 사용하는 방법은, 내가 동적으로 선택 고유 Sku2 OrderDetailDeliveryReview에서 쿼리 (케이스 ... 문을 SUM을 생성하고 생성 된 SQL 코드를 실행할 수 있나요?
해결법
-
==============================
1.메타 데이터에서 동적 피벗 SQL을 생성하여 수년에 걸쳐이 많이 대답하는 데,이 예제를 보라 :
메타 데이터에서 동적 피벗 SQL을 생성하여 수년에 걸쳐이 많이 대답하는 데,이 예제를 보라 :
SQL 동적 피벗 - 열을 주문하는 방법
열의 알 수없는 번호에 SQL Server 2005의 피벗
SQL 쿼리 또는 뷰 "동적 열"보여줄 것이다 무엇
T-SQL에서 XML 컬럼의 속성에 I 피벗을 어떻게
어떻게 SQL 문에 DRY 원칙을 적용하는 피벗 개월
특정 경우 (대신 SQL 서버 2005의 PIVOT 기능의 ANSI 피벗 사용) :
DECLARE @template AS varchar(max) SET @template = 'SELECT SKU1 {COLUMN_LIST} FROM OrderDetailDeliveryReview Group By OrderShipToID, DeliveryDate, SKU1 ' DECLARE @column_list AS varchar(max) SELECT @column_list = COALESCE(@column_list, ',') + 'SUM(Case When Sku2=' + CONVERT(varchar, Sku2) + ' Then Quantity Else 0 End) As [' + CONVERT(varchar, Sku2) + '],' FROM OrderDetailDeliveryReview GROUP BY Sku2 ORDER BY Sku2 Set @column_list = Left(@column_list,Len(@column_list)-1) SET @template = REPLACE(@template, '{COLUMN_LIST}', @column_list) EXEC (@template)
-
==============================
2.내가 SO 검색 엔진 알고 완벽하지 않지만 귀하의 질문은 SQL 서버 PIVOT 열 데이터에 답하고있다. 또한 SQL에서 크로스 탭 쿼리 및 피벗 테이블 만들기를 참조하십시오.
내가 SO 검색 엔진 알고 완벽하지 않지만 귀하의 질문은 SQL 서버 PIVOT 열 데이터에 답하고있다. 또한 SQL에서 크로스 탭 쿼리 및 피벗 테이블 만들기를 참조하십시오.
-
==============================
3.당신이 어떤 테이블에서 모든 동적으로 당겨 수있을 때 왜 열심히 열 이름을 코딩 사용합니까?
당신이 어떤 테이블에서 모든 동적으로 당겨 수있을 때 왜 열심히 열 이름을 코딩 사용합니까?
UNPIVOT과 유착을 사용하여 동적으로 나열하는 기록의 모든 레코드에 대한 모든 테이블의 컬럼 및 관련 열 값의 목록을 당겨 행에 의해 값으로 열 이름의 목록에 결합 할 수 있습니다. 여기에 코드입니다. 그냥 데이터베이스 및 테이블 이름을 놓습니다. 열 / 값 테이블은 SQL 서버에서 당신을 위해 생성됩니다. 당신은 SQL 변형 또는 텍스트 문자열로 변환 할 열 값의 공유 열을 얻기 위해, 명심하십시오. 그러나 좋은 방법은 우리의 동안 루프 또는 커서로 열 이름과 유형을 일치하는 값의 샘플 열 목록을 얻을 수 있습니다. 그것의 꽤 빨리 :
-- First get a list of all known columns in your database, dynamically... DECLARE @COLUMNS nvarchar(max) SELECT @COLUMNS = CASE WHEN A.DATA_TYPE = 'nvarchar' OR A.DATA_TYPE = 'ntext' THEN COALESCE(@COLUMNS + ',','') + 'CAST(CONVERT(nvarchar(4000),['+A.[name]+']) AS sql_variant) AS ['+A.[name]+']' WHEN A.DATA_TYPE = 'datetime' OR A.DATA_TYPE = 'smalldatetime' THEN COALESCE(@COLUMNS + ',','') + 'CAST(CONVERT(nvarchar,['+A.[name]+'],101) AS sql_variant) AS ['+A.[name]+']' ELSE COALESCE(@COLUMNS + ',','') + 'CAST(['+A.[name]+'] AS sql_variant) AS ['+A.[name]+']' END FROM ( SELECT A.name, C.DATA_TYPE FROM YOURDATABASENAME.dbo.syscolumns A INNER JOIN YOURDATABASENAME.dbo.sysobjects B ON B.id = A.id LEFT JOIN ( SELECT COLUMN_NAME, DATA_TYPE FROM YOURDATABASENAME.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'YOURTABLENAME' ) C ON C.COLUMN_NAME = A.name WHERE B.name = 'YOURTABLENAME' AND C.DATA_TYPE <> 'timestamp' ) A -- Test that the formatted columns list is returned... --SELECT @COLUMNS -- This gets a second string list of all known columns in your database, dynamically... DECLARE @COLUMNS2 nvarchar(max) SELECT @COLUMNS2 = COALESCE(@COLUMNS2 + ',','') + '['+A.[name]+']' FROM ( SELECT A.name, C.DATA_TYPE FROM YOURDATABASENAME.dbo.syscolumns A INNER JOIN YOURDATABASENAME.dbo.sysobjects B ON B.id = A.id LEFT JOIN ( SELECT COLUMN_NAME, DATA_TYPE FROM YOURDATABASENAME.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'YOURTABLENAME' ) C ON C.COLUMN_NAME = A.name WHERE B.name = 'YOURTABLENAME' AND C.DATA_TYPE <> 'timestamp' ) A -- Test that the formatted columns list is returned... --SELECT @COLUMNS2 -- Now plug in the list of the dynamic columns list into an UNPIVOT to get a Column Name / Column Value list table... DECLARE @sql nvarchar(max) SET @sql = ' SELECT ColumnName,ColumnValue FROM ( SELECT '+@COLUMNS+' FROM YOURDATABASENAME.dbo.YOURTABLENAME WHERE CHANGE_ID IN (SELECT ChangeId FROM YOURDATABASENAME.dbo.OperatorProcess WHERE OperatorProcessID = 3) ) AS SourceTable UNPIVOT ( ColumnValue FOR ColumnName IN ('+@COLUMNS2+') ) AS PivotTable ' EXEC (@sql)
-
==============================
4.
-- Darshankar Madhusudan i can do dynamic columnheading table easly... --thanks declare @incr int = 1, @col int, @str varchar(max), @tblcrt varchar(max), @insrt varchar(max), set @tblcrt = 'DECLARE @Results table (' set @str = '' set @insrt = '' select @col = max(column_id) From tempdb.sys.all_columns where object_id = object_id('tempdb.dbo.#aaa') while @incr <= @col BEGIN SELECT @STR = @STR +case when @incr = 1 then '''' else ',''' end +rtrim(ltrim(NAME))+'''' FROM TEMPDB.SYS.ALL_COLUMNS WHERE OBJECT_ID = OBJECT_ID('TEMPDB.DBO.#AAA') and column_id = @incr set @tblcrt = @tblcrt + case when @incr = 1 then '' else ',' end + 'Fld'+CAST(@incr as varchar(3)) +' varchar(50)' set @insrt = @insrt + case when @incr = 1 then '' else ',' end + 'Fld'+CAST(@incr as varchar(3)) SET @INCR = @INCR + 1 END set @tblcrt = @tblcrt + ')' set @insrt = 'insert into @Results('+@insrt+') values (' + @STR +')' set @tblcrt = @tblcrt+ ';' + @insrt + 'select * from @Results ' exec(@tblcrt)
from https://stackoverflow.com/questions/2554826/dynamic-sql-to-generate-column-names by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] CASE 대 디코드 (0) | 2020.04.25 |
---|---|
[SQL] 그룹화 MySQL의 데이터에서 최신 날짜를 가져옵니다 (0) | 2020.04.25 |
[SQL] MySQL은, 연결하여 두 개의 열 (0) | 2020.04.25 |
[SQL] 이 별도의 열로 두 SQL 쿼리의 결과를 결합 (0) | 2020.04.25 |
[SQL] 어떻게 업데이트하고 위해 MS의 SQL을 사용하여합니다 (0) | 2020.04.25 |