sql - 在 SQL Server 中使用数据透视不返回所需的输出
问题描述
我有两个这样的表:
**tblTagDescription**
and **tblDataLog**
现在我想显示任何特定组的记录,并且在一个组中可能有多个 id 的相同组tbltagdescription
。而 id oftbltagdescription
是tblDataLog
as的外键TagDescID
。
这里“Group1”有 10 个 ID,从 1 到 10。在 tbldatalog 中这些 ID(从 1 到 10)可能有多个记录。我希望这些 ID 从 1 到作为列。为此,我使用了枢轴:
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)
推荐阅读
- python - 具有动态估计测量方差的卡尔曼滤波器
- java - 使用 PrintWriter 和 File 获取文件未找到异常
- reactjs - 如何将 React 应用程序集成到现有的 asp.net 核心应用程序中?
- c++ - 是否有一种代码密集度较低的方法来使用非默认构造函数初始化数组?
- firemonkey - 有没有办法使用 Delphi 10.3 FMX TCalendar(或类似组件)选择/突出显示日期范围/系列?
- node.js - 使用 Node、SocketIO 和 Redis 将用户添加到连接到不同服务器的房间
- python - Errors: Module 'pygame' has no 'init' member, and others
- vue.js - Vue.js 自动完成
- python - 地面实况拟合比对噪声数据的交叉验证拟合更差?
- php - WooCommerce 购物车验证:检查是否始终在其他产品之前添加特定产品