Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 如何实现动态构造柱的计算_Sql_Sql Server_Tsql - Fatal编程技术网

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)