Sql 如何实现动态构造柱的计算
我有动态脚本:Sql 如何实现动态构造柱的计算,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有动态脚本: SET @cols = stuff((SELECT DISTINCT ','+Quotename(CONVERT(DATE, Start_dt)) FROM Events WHERE Start_dt >= Cast(Dateadd(day, -1, Getdate()) AS DATE) ORDER BY Start_dt DESC FOR xml path(
SET @cols = stuff((SELECT DISTINCT ','+Quotename(CONVERT(DATE, Start_dt))
FROM Events
WHERE Start_dt >= Cast(Dateadd(day, -1, Getdate()) AS DATE)
ORDER BY Start_dt DESC
FOR xml path('')) ,1,1,'')
--Print @cols
SET @select_cols = stuff((SELECT DISTINCT ',Max('+Quotename(CONVERT(DATE, Start_dt))+') as '+Quotename(CONVERT(DATE, t))
FROM Events
WHERE Start_dt >= Cast(Dateadd(day, -1, Getdate()) AS DATE)
ORDER BY Start_dt DESC
FOR xml path('')) ,1,1,'')
--Print @select_cols
Select @query = '
Select Name, tableName,'+@select_cols+'
from (
SELECT Name,
tableName,
Cnt
FROM Table1 l
WHERE Name=''Employee'' AND
Start_dt >= CAST(dateadd(day, -1, getdate()) as date))T
PIVOT (MAX(Cnt)FOR Start_dt IN ('+@cols+') )PVT
GROUP BY Name, tableName
'
EXEC (@query)
并且得到这样的输出
Name TableName [2017-07-10] [2017-07-09]
mohan Employee 10020 10080
我想对两个日期列的计数进行计算
Name TableName [2017-07-10] [2017-07-09] Difference Percentage
mohan Employee 10020 10080 60 0.6%
我需要如何在此查询中实现此计算
静态模式下的百分比计算:
case when [2017-07-09] > [2017-07-10]
then cast(round (([2017-07-09] - [2017-07-10]) *1. / [2017-07-09] * 100, 2) as decimal(3,1))
else 0
end as [%]
如何在动态中添加此计算您可以再添加一个查询以获得@diff\u cols,如下所示
declare @diff_cols varchar(max)
Set @diff_Cols = stuff((SELECT '-Max('+Quotename(CONVERT(DATE, Start_dt))+') '
FROM Events
WHERE Start_dt >= Cast(Dateadd(day, -1, Getdate()) AS DATE)
group by Start_dt
ORDER BY Start_dt DESC
FOR xml path('')) ,1,1,'')
并修改您的动态查询,如下所示:
Select @query = '
Select Name, tableName,'+@select_cols+', Difference = '+@diff_cols+', [Percentage] = case when QuoteName(ParseName(replace(@cols,'','',''.''),2)) > QuoteName(ParseName(replace(@cols,'','',''.''),1))
then cast(round ((QuoteName(ParseName(replace(@cols,'','',''.''),2)) - QuoteName(ParseName(replace(@cols,'','',''.''),1))) *1. / QuoteName(ParseName(replace('[2017-07-10],[2017-07-09]','','',''.''),1))* 100, 2) as decimal(3,1))
else 0
end as [%]
from (
SELECT Name,
tableName,
Cnt
FROM Table1 l
WHERE Name=''Employee'' AND
Start_dt >= CAST(dateadd(day, -1, getdate()) as date))T
PIVOT (MAX(Cnt)FOR Start_dt IN ('+@cols+') )PVT
GROUP BY Name, tableName
'
Select @query -- check your query and then execute as below
EXEC (@query)
或者类似的东西(我没有测试过)
是的,我会检查并让你知道,但是百分比变得复杂@kanan我会发布百分比查询建议我如何在动态SQL中实现你能检查静态更新逻辑并建议我如何以动态方式实现更新我的答案根据使用的ParseName获得第一和第二个日期我会检查EMSG 537,级别16,状态3,第22行传递给LEFT或SUBSTRING函数的长度参数无效
SET @cols = stuff((SELECT DISTINCT ','+Quotename(CONVERT(DATE, Start_dt))
FROM Events
WHERE Start_dt >= Cast(Dateadd(day, -1, Getdate()) AS DATE)
ORDER BY Start_dt DESC
FOR xml path('')) ,1,1,'')
--Print @cols
SET @select_cols = stuff((SELECT DISTINCT ',Max('+Quotename(CONVERT(DATE, Start_dt))+') as '+Quotename(CONVERT(DATE, t))
FROM Events
WHERE Start_dt >= Cast(Dateadd(day, -1, Getdate()) AS DATE)
ORDER BY Start_dt DESC
FOR xml path('')) ,1,1,'')
--Print @select_cols
/* --- line changed --- */
Select @query = 'SELECT A.*'
+', ' + REPLACE(@cols,',','-')+' AS Difference' +', ('+ REPLACE(@cols,',','-') +')/'+SUBSTRING(@cols, CHARINDEX(@cols,',')-1)+' AS Percentage FROM ('
+
'Select Name, tableName,'+@select_cols+'
from (
SELECT Name,
tableName,
Cnt
FROM Table1 l
WHERE Name=''Employee'' AND
Start_dt >= CAST(dateadd(day, -1, getdate()) as date))T
PIVOT (MAX(Cnt)FOR Start_dt IN ('+@cols+') )PVT
GROUP BY Name, tableName
) A
'
EXEC (@query)