SQL查询-选择总计大于0的列

SQL查询-选择总计大于0的列,sql,sql-server,tsql,Sql,Sql Server,Tsql,以下是我的SQL查询: DROP TABLE #tempi CREATE TABLE #tempi ( nav1 VARCHAR(50), nav2 INT , nav3 INT , nav4 INT ,

以下是我的SQL查询:

DROP TABLE #tempi
CREATE TABLE #tempi
             (
                          nav1 VARCHAR(50),
                          nav2 INT        ,
                          nav3 INT        ,
                          nav4 INT        ,
                          nav5 INT
             )
INSERT
INTO   #tempi
SELECT   COALESCE(CAST(machinename AS VARCHAR(28)), 'Grand Total:')               AS machinename        ,
         SUM(CASE WHEN vfrm.job_id = '1001' THEN DATEDIFF(mi, 0, total_time) END) AS crate_small        ,
         SUM(CASE WHEN vfrm.job_id = '1002' THEN DATEDIFF(mi, 0, total_time) END) AS crate_medium       ,
         SUM(CASE WHEN vfrm.job_id = '1014' THEN DATEDIFF(mi, 0, total_time) END) AS front_air_deflector,
         SUM(CASE WHEN vfrm.job_id = '9999' THEN DATEDIFF(mi, 0, total_time) END) AS no_schedule
FROM     ven_fullreportmaster vfrm
         INNER JOIN ven_descriptionmaster vdm
         ON       vdm.description_id = vfrm..description_id
         INNER JOIN ven_machinemaster vm
         ON       vm.machine_id = vfrm..machine_id
WHERE    vfrm.entry_date        = CONVERT(VARCHAR, GETDATE()-7, 105)
         --and  vfrm.shift_id =1
AND      vfrm.is_task_completed = 'Y'
GROUP BY machinename WITH ROLLUP
tempi
表中的输出:

nav1    nav2    nav3   nav4   nav5

abc      0:0     0:0     0:0   1:0

def      0:0     1:0     2:0   1:0

ghi      0:0     0:0     0:0   1:0

grand    0:0     1:0     2:0   3:0
 total
我想选择总计大于0的列。如何实现

CREATE TABLE #tempi ( nav1 VARCHAR(50), nav2 INT, nav3 INT, nav4 INT, nav5 INT ) 
INSERT INTO #tempi VALUES('Grand Total:',    0.0,     1.0,     2.0,   3.0) 

DECLARE @dynsql NVARCHAR(MAX)

SELECT @dynsql = ISNULL(@dynsql + ',','') + QUOTENAME(col) FROM #tempi 
UNPIVOT(nav FOR col IN (nav2,nav3,nav4,nav5)) AS unpvt
WHERE  nav1 = 'Grand Total:' AND nav>0

IF(@@ROWCOUNT > 0)
    BEGIN
    SET @dynsql = 'SELECT ' + @dynsql + ' FROM #tempi'
    EXEC(@dynsql)
    END

DROP TABLE #tempi
或者,如果您不能使用
UNPIVOT

DECLARE @dynsql NVARCHAR(MAX)

SELECT @dynsql = CASE WHEN nav2>0 THEN ',nav2' ELSE '' END + 
                 CASE WHEN nav3>0 THEN ',nav3' ELSE '' END +
                 CASE WHEN nav4>0 THEN ',nav4' ELSE '' END +
                 CASE WHEN nav5>0 THEN ',nav5' ELSE '' END
FROM #tempi 
WHERE  nav1 = 'Grand Total:'

IF(LEN(@dynsql) > 0)
    BEGIN
    SET @dynsql = STUFF(@dynsql,1,1,'SELECT ') + ' FROM #tempi'
    EXEC(@dynsql)
    END
或者,如果您不能使用
UNPIVOT

DECLARE @dynsql NVARCHAR(MAX)

SELECT @dynsql = CASE WHEN nav2>0 THEN ',nav2' ELSE '' END + 
                 CASE WHEN nav3>0 THEN ',nav3' ELSE '' END +
                 CASE WHEN nav4>0 THEN ',nav4' ELSE '' END +
                 CASE WHEN nav5>0 THEN ',nav5' ELSE '' END
FROM #tempi 
WHERE  nav1 = 'Grand Total:'

IF(LEN(@dynsql) > 0)
    BEGIN
    SET @dynsql = STUFF(@dynsql,1,1,'SELECT ') + ' FROM #tempi'
    EXEC(@dynsql)
    END

要动态更改列列表,需要动态SQL。如果没有总计大于0的列,该怎么办?大约有40个作业列。。和15台机器(行)…因此至少有一列大于0..所有列都不可能为零:)请帮助我为其编写动态查询..我拼命搜索..动态更改列列表需要动态SQL。如果没有总计大于0的列,该怎么办?大约有40个作业列。。和15台机器(行)…因此至少有一列将大于0..所有列不可能都为零:)请帮助我为其编写动态查询..我拼命搜索..嗨,martin,我收到一个错误..Msg 156,级别15,状态1,第4行关键字“for”附近的语法不正确,我刚刚复制了您的代码并在sql中执行。@navbingo-您是在sql Server 2000上还是在其他地方?看起来像是您在sql Server 2000兼容模式下运行它所针对的数据库。这是我从sql Server 2008中的“关于”选项卡中获得的信息。。现在我该怎么办,要使上述代码正常工作,ManagementStudio的版本无关紧要。
SELECT@@VERSION
说了什么?和
EXEC sp_dbcmptlevel'YourDatabaseName'
hi martin,我收到一个错误..Msg 156,15级,状态1,第4行关键字“FOR”附近的语法不正确,我刚刚复制了您的代码并在sql中执行。@navbingo-您是在sql Server 2000上还是在其他地方?看起来像是您在sql Server 2000兼容模式下运行它所针对的数据库。这是我从sql Server 2008中的“关于”选项卡中获得的信息。。现在我该怎么办,要使上述代码正常工作,ManagementStudio的版本无关紧要。
SELECT@@VERSION
说了什么?和执行sp_dbcmptlevel'YourDatabaseName'