动态sql拼接

南方的姑娘 2016-11-29 04:44:21
alter PROC 销售量在各省分布
@year int,@day int AS
SET NOCOUNT ON
DECLARE @STRSQL VARCHAR(MAX)
select t6.FName as 存货名称,t4.FName,t2.FConsignAmount,'' as 总计 into #TEMP from ICStockBill t1
inner join ICStockBillEntry t2 on t1.finterid = t2.FInterID
inner join t_Item t3 on t3.FItemID = t1.FSupplyID
inner join t_Item t4 on t4.FItemID = t3.FParentID
left join t_ICItem t6 on t2.fitemid = t6.fitemid --物料表
where t3.FNumber like '1.%'
SET @STRSQL = ''
SELECT @STRSQL = @STRSQL + 'SELECT 存货名称,总计'
SELECT @STRSQL = @STRSQL + 'sum(case when FNAME = '''+FName+''' then FConsignAmount else 0 end) as '''+FName+''', '
FROM (select distinct FName from #TEMP where FName <> '') as a order by FName
SELECT @STRSQL = left(@STRSQL,len(@STRSQL)-1) + 'FROM #TEMP GROUP BY 存货名称 '

SELECT @STRSQL = @STRSQL + 'UNION ALL
SELECT 存货名称,总计,'
SELECT @STRSQL = @STRSQL + 'sum(case when FNAME = 存货名称 then FConsignAmount else 0 end) as ''总计'', '
FROM (select distinct 存货名称 from #TEMP where 存货名称 <> '') as a order by 存货名称
SELECT @STRSQL = left(@STRSQL,len(@STRSQL)-1) + 'FROM #TEMP GROUP BY 总计 '

PRINT @STRSQL
EXEC (@STRSQL)
显示结果
存货名称 总计 A省.....B省...........................


错误提示:消息 195,级别 15,状态 10,第 1 行
'总计sum' 不是可以识别的 内置函数名称。
...全文
526 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2016-11-30
  • 打赏
  • 举报
回复
PRINT 'aaa''bbb:字符串里面单引号要双写'
PRINT '''aaa:双写单引号在字符串的头尾,看起来就是3连写'

aaa'bbb:字符串里面单引号要双写
'aaa:双写单引号在字符串的头尾,看起来就是3连写
  • 打赏
  • 举报
回复
引用 7 楼 Tiger_Zhao 的回复:
SELECT * INTO #TEMP
FROM (
    select 'AAA' as 存货名称,'BBB' FName,111 FConsignAmount,'' as 总计 UNION ALL
    SELECT 'CCC','DDD',222,'' UNION ALL
    SELECT 'CCC','EEE',222,''
) t
我用上面的代码生成临时表,加上了#2指出的逗号。最终合成了下面的SQL
  SELECT 存货名称,
         总计,
         SUM(CASE 
               WHEN fname = 'BBB' THEN fconsignamount
               ELSE 0
             END) AS 'BBB',
         SUM(CASE 
               WHEN fname = 'DDD' THEN fconsignamount
               ELSE 0
             END) AS 'DDD',
         SUM(CASE 
               WHEN fname = 'EEE' THEN fconsignamount
               ELSE 0
             END) AS 'EEE'
    FROM #temp
GROUP BY 存货名称
UNION ALL
  SELECT 存货名称,
         总计,
         SUM(CASE 
               WHEN fname = 存货名称 THEN fconsignamount
               ELSE 0
             END) AS '总计',
         SUM(CASE 
               WHEN fname = 存货名称 THEN fconsignamount
               ELSE 0
             END) AS '总计'
    FROM #temp
GROUP BY 总计
先不说语法错误,你到底想做什么?

老师  我问个问题
declare @s varchar(100),@sql varchar(1000)
set @s='a,b,c,d,e'
set @sql='select col='''+ replace(@s,',',''' union all select ''') +''''  ---是按字符格式 转的
PRINT @sql 
exec (@sql)
这个 里面  @sql='select col='''+ replace(@s,',',''' union all select ''') +''''   这些地方为什么 '''+  这个3个单引号,还有 为什么  ''' union all select '''   这也要3个引号?
  • 打赏
  • 举报
回复



上面是 书写的错误,其他的 逻辑的 就没看 了
卖水果的net 版主 2016-11-30
  • 打赏
  • 举报
回复
UNION ALL
  SELECT 存货名称,
         总计,
         SUM(CASE 
               WHEN fname = 存货名称 THEN fconsignamount
               ELSE 0
             END) AS '总计',
         SUM(CASE 
               WHEN fname = 存货名称 THEN fconsignamount
               ELSE 0
             END) AS '总计'
    FROM #temp
GROUP BY 总计
这是加一个汇总行吗 ?

  SELECT 存货名称,
         SUM() AS '总计'
    FROM #temp
GROUP BY  存货名称
Tiger_Zhao 2016-11-30
  • 打赏
  • 举报
回复
SELECT * INTO #TEMP
FROM (
select 'AAA' as 存货名称,'BBB' FName,111 FConsignAmount,'' as 总计 UNION ALL
SELECT 'CCC','DDD',222,'' UNION ALL
SELECT 'CCC','EEE',222,''
) t

我用上面的代码生成临时表,加上了#2指出的逗号。最终合成了下面的SQL
  SELECT 存货名称,
总计,
SUM(CASE
WHEN fname = 'BBB' THEN fconsignamount
ELSE 0
END) AS 'BBB',
SUM(CASE
WHEN fname = 'DDD' THEN fconsignamount
ELSE 0
END) AS 'DDD',
SUM(CASE
WHEN fname = 'EEE' THEN fconsignamount
ELSE 0
END) AS 'EEE'
FROM #temp
GROUP BY 存货名称
UNION ALL
SELECT 存货名称,
总计,
SUM(CASE
WHEN fname = 存货名称 THEN fconsignamount
ELSE 0
END) AS '总计',
SUM(CASE
WHEN fname = 存货名称 THEN fconsignamount
ELSE 0
END) AS '总计'
FROM #temp
GROUP BY 总计

先不说语法错误,你到底想做什么?
南方的姑娘 2016-11-30
  • 打赏
  • 举报
回复
另外加一列,汇总行的数据
快溜 2016-11-29
  • 打赏
  • 举报
回复
贴详细一点,你贴的全是错的
南方的姑娘 2016-11-29
  • 打赏
  • 举报
回复
不是逗号原因
快溜 2016-11-29
  • 打赏
  • 举报
回复
FNAME = 存货名称 这就错了
南方的姑娘 2016-11-29
  • 打赏
  • 举报
回复
SELECT 存货名称,总计sum(case when FNAME = '安徽省' , sum(case when FNAME = '重庆市' then FConsignAmount else 0 end) as '重庆市'FROM #TEMP GROUP BY 存货名称 UNION ALL
SELECT 存货名称,总计, sum(case when FNAME = 存货名称 then FConsignAmount else 0 end) as '总计', sum(case when FNAME = 存货名称 then FConsignAmou
消息 195,级别 15,状态 10,第 1 行
'总计sum' 不是可以识别的 内置函数名称。
Tiger_Zhao 2016-11-29
  • 打赏
  • 举报
回复
SET @STRSQL = ''
SELECT @STRSQL = @STRSQL + 'SELECT 存货名称,总计,' -- 少了逗号
快溜 2016-11-29
  • 打赏
  • 举报
回复
PRINT @STRSQL输出什么 贴出来瞅瞅

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧