Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中使用pivot未返回所需的输出_Sql_Sql Server_Sql Server 2008_Pivot - Fatal编程技术网

在SQL Server中使用pivot未返回所需的输出

在SQL Server中使用pivot未返回所需的输出,sql,sql-server,sql-server-2008,pivot,Sql,Sql Server,Sql Server 2008,Pivot,我有两张这样的桌子: **tblTagDescription** 现在我想显示任何特定组的记录,在其中一个组中,tbltagdescription中的多个id可能有相同的组。tbltagdescription的id是tblDataLog作为TagDescID的外键 这里的“Group1”有10个ID,从1到10。tbldatalog中可能有多条ID为1到10的记录。我希望这些ID从1到作为列。为此,我使用了pivot: DECLARE @COlsID NVARCHAR(MAX) DECLARE

我有两张这样的桌子:

**tblTagDescription**
现在我想显示任何特定组的记录,在其中一个组中,tbltagdescription中的多个id可能有相同的组。tbltagdescription的id是tblDataLog作为TagDescID的外键

这里的“Group1”有10个ID,从1到10。tbldatalog中可能有多条ID为1到10的记录。我希望这些ID从1到作为列。为此,我使用了pivot:

DECLARE @COlsID NVARCHAR(MAX)
DECLARE @SQL NVARCHAR(MAX)
DECLARE @Group NVARCHAR(50) = 'Group1'

IF OBJECT_ID('tempdb..##MYTABLE') IS NOT NULL 
    DROP TABLE ##MYTABLE

SELECT 
    @COlsID = COALESCE(@ColsID + '],[','') + CONVERT(NVARCHAR(5), z.TagDescID)  
FROM
    (SELECT DISTINCT TOP 50 tblDataLog.TagDescID 
     FROM tblDataLog 
     INNER JOIN tblTagDescription ON tblDataLog.TagDescID = tblTagDescription.ID 
     ORDER BY tblDataLog.TagDescID) z  

SET @COlsID='[' + @COlsID + ']'

SET @SQL='select [DATE],SHIFT, ' + @COlsID + ' into ##MYTABLE from ( select [Date], Value, 
                     (CASE  
                                WHEN ((DATEPART(hour,[DATE]))>6 and (DATEPART(hour,[DATE]))<14) THEN ''A'' 
                                WHEN ((DATEPART(hour,[DATE]))>=14 and (DATEPART(hour,[DATE]))<22) THEN ''B'' 
                                WHEN ((DATEPART(hour,[DATE]))>=22 or (DATEPART(hour,[DATE]))<6) THEN ''C'' 
                            END )AS SHIFT 

                     from tblDataLog )d pivot(max(Value) for TagDescID in (' + @COlsID + ')) piv;'

        EXEC (@SQL)
现在,当我执行此语句时,我得到一个错误:

列名“TagDescID”无效


但是tbldatalog中有这个专栏。如何解决此查询?

子查询中需要TagDescID列

DECLARE @COlsID NVARCHAR(MAX) = ''
DECLARE @COlsAlias NVARCHAR(MAX) = ''
DECLARE @SQL NVARCHAR(MAX)
DECLARE @Group NVARCHAR(50) = 'Group1'

SELECT 
   @COlsID = @ColsID + ',' + z.TagDescID, 
   @COlsAlias = @COlsAlias + ',' + z.TagDescID + ' AS ' + z.ReportTag   
FROM
    (SELECT DISTINCT TOP 50 tblDataLog.TagDescID ID,  QUOTENAME(CONVERT(NVARCHAR(5), tblDataLog.TagDescID )) TagDescID, QUOTENAME(tblTagDescription.ReportTag) ReportTag 
     FROM tblDataLog 
        INNER JOIN tblTagDescription ON tblDataLog.TagDescID = tblTagDescription.ID 
     ORDER BY tblDataLog.TagDescID 
     ) z

SET @COlsID= STUFF(@COlsID,1,1,'')
SET @COlsAlias= STUFF(@COlsAlias,1,1,'')

SET @SQL='select [DATE],SHIFT, ' + @COlsAlias + ' into ##MYTABLE from ( select [Date], Value, TagDescID,
                     (CASE  
                                WHEN ((DATEPART(hour,[DATE]))>6 and (DATEPART(hour,[DATE]))<14) THEN ''A'' 
                                WHEN ((DATEPART(hour,[DATE]))>=14 and (DATEPART(hour,[DATE]))<22) THEN ''B'' 
                                WHEN ((DATEPART(hour,[DATE]))>=22 or (DATEPART(hour,[DATE]))<6) THEN ''C'' 
                            END )AS SHIFT 

                     from tblDataLog )d pivot(max(Value) for TagDescID in (' + @COlsID + ')) piv;'

EXEC (@SQL)

如果可能,请说明如何将@COlsID中的每个值重命名为tblTagDescription.ReportTag。如果可能的话,请这样做。在获取列名和动态子查询sql中,您可以使用ReportTag column而不是TagDescID,但ReportTag在这两个列中都不可用。只有tblTagDescription的Id是外键,因为tblDataLogI中的TgDescID使用sql server 2008,并且“CONCAT”不是可识别的内置函数名我更改了CONCAT部分。
DECLARE @COlsID NVARCHAR(MAX) = ''
DECLARE @COlsAlias NVARCHAR(MAX) = ''
DECLARE @SQL NVARCHAR(MAX)
DECLARE @Group NVARCHAR(50) = 'Group1'

SELECT 
   @COlsID = @ColsID + ',' + z.TagDescID, 
   @COlsAlias = @COlsAlias + ',' + z.TagDescID + ' AS ' + z.ReportTag   
FROM
    (SELECT DISTINCT TOP 50 tblDataLog.TagDescID ID,  QUOTENAME(CONVERT(NVARCHAR(5), tblDataLog.TagDescID )) TagDescID, QUOTENAME(tblTagDescription.ReportTag) ReportTag 
     FROM tblDataLog 
        INNER JOIN tblTagDescription ON tblDataLog.TagDescID = tblTagDescription.ID 
     ORDER BY tblDataLog.TagDescID 
     ) z

SET @COlsID= STUFF(@COlsID,1,1,'')
SET @COlsAlias= STUFF(@COlsAlias,1,1,'')

SET @SQL='select [DATE],SHIFT, ' + @COlsAlias + ' into ##MYTABLE from ( select [Date], Value, TagDescID,
                     (CASE  
                                WHEN ((DATEPART(hour,[DATE]))>6 and (DATEPART(hour,[DATE]))<14) THEN ''A'' 
                                WHEN ((DATEPART(hour,[DATE]))>=14 and (DATEPART(hour,[DATE]))<22) THEN ''B'' 
                                WHEN ((DATEPART(hour,[DATE]))>=22 or (DATEPART(hour,[DATE]))<6) THEN ''C'' 
                            END )AS SHIFT 

                     from tblDataLog )d pivot(max(Value) for TagDescID in (' + @COlsID + ')) piv;'

EXEC (@SQL)