sql查询结果横向显示

cyerp 2014-05-04 05:45:14
FL表中 字段名称:A(台号),B(名称),C(金额),D(排序),E(日期)




我使用的横向查询显示语句:

declare @sql varchar(8000)
set @sql = 'select A AS 台号'
select @sql = @sql + ' , max(case B when ''' + B + ''' then C else 0 end) [' + B + ']'
from (select distinct B,D from fl ) as a order by D
set @sql = @sql + ' from fl where 日期='+quotename('2012-5-7','''')+' group by A' exec(@SQL)


问题:C字段中的金额如果是负数就被忽略不统计了 ,如:c字段中显示“-0.4” 查询后”-0.4“被忽略不统计了

谢谢 帮我看下
...全文
354 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2014-05-05
  • 打赏
  • 举报
回复
看来还是你的空格太多了
cyerp 2014-05-05
  • 打赏
  • 举报
回复
引用 19 楼 DBA_Huangzj 的回复:
用这个吧,我减少了很多空格
DECLARE @sql VARCHAR(8000) 
SET @sql = 'select A 台号' 
SELECT  @sql = @sql + ',max(case B when ''' + LTRIM(RTRIM(B))
        + ''' then C else null end) ['+LTRIM(RTRIM(B))+']'
FROM    ( SELECT DISTINCT
                    B ,
                    D
          FROM      fl
        ) AS a
ORDER BY D 
SET @sql = @sql + ' from fl where 日期=' + QUOTENAME('2012-5-7', '''')
    + ' group by A'
print(@SQL)
LTRIM(RTRIM()) 可以了 真的太感谢你了 感谢 感谢 十分感谢
發糞塗牆 2014-05-05
  • 打赏
  • 举报
回复
用这个吧,我减少了很多空格
DECLARE @sql VARCHAR(8000) 
SET @sql = 'select A 台号' 
SELECT  @sql = @sql + ',max(case B when ''' + LTRIM(RTRIM(B))
        + ''' then C else null end) ['+LTRIM(RTRIM(B))+']'
FROM    ( SELECT DISTINCT
                    B ,
                    D
          FROM      fl
        ) AS a
ORDER BY D 
SET @sql = @sql + ' from fl where 日期=' + QUOTENAME('2012-5-7', '''')
    + ' group by A'
print(@SQL)
cyerp 2014-05-05
  • 打赏
  • 举报
回复
引用 15 楼 DBA_Huangzj 的回复:
DTPicker5.value 传入了什么值?你这个貌似不是纯SQL啊




是时间控件
开始时间 DTPicker5.value
结束时间 DTPicker6.value
發糞塗牆 2014-05-05
  • 打赏
  • 举报
回复
执行一下这个试试,你看你那些列名的空格,已经消耗了大量空间
DECLARE @sql VARCHAR(8000) 
SET @sql = 'select A 台号' 
SELECT  @sql = @sql + ' ,max(case B when ''' + B
        + ''' then C else null end) ['+B+']'
FROM    ( SELECT DISTINCT
                    B ,
                    D
          FROM      fl
        ) AS a
ORDER BY D 
SET @sql = @sql + ' from fl where 日期=' + QUOTENAME('2012-5-7', '''')
    + ' group by A'
print(@SQL)
cyerp 2014-05-05
  • 打赏
  • 举报
回复
引用 13 楼 DBA_Huangzj 的回复:
你的问题是变量不够存放你的字符,但是按5楼的说法: SELECT A AS 台号, MAX(CASE B WHEN '白酒红酒' THEN C ELSE NULL END) [白酒红酒], MAX(CASE B WHEN '刷卡 ' THEN C ELSE NULL END) [刷卡 ], MAX(CASE B WHEN '现金 ' THEN C ELSE NULL END) [现金 ], FROM 分类营业统计_主 WHERE E BETWEEN '" & CStr(DTPicker5.value) & "' AND '" & CStr(DT 这样的数据不应该超过8000啊,你的真实环境就是这样?
我没有全部粘贴上来 实际原始效果是这样的 SELECT A AS 台号, MAX(CASE B WHEN '白酒红酒 ' THEN C ELSE NULL END) [白酒红酒 ], MAX(CASE B WHEN '包桌套餐 ' THEN C ELSE NULL END) [包桌套餐 ], MAX(CASE B WHEN '经典茶品 ' THEN C ELSE NULL END) [经典茶品 ], MAX(CASE B WHEN '精品凉菜 ' THEN C ELSE NULL END) [精品凉菜 ], MAX(CASE B WHEN '精品香烟 ' THEN C ELSE NULL END) [精品香烟 ], MAX(CASE B WHEN '美味汤羹 ' THEN C ELSE NULL END) [美味汤羹 ], MAX(CASE B WHEN '面点主食 ' THEN C ELSE NULL END) [面点主食 ], MAX(CASE B WHEN '啤酒饮料 ' THEN C ELSE NULL END) [啤酒饮料 ], MAX(CASE B WHEN '其 它 ' THEN C ELSE NULL END) [其 它 ], MAX(CASE B WHEN '青蔬菜类 ' THEN C ELSE NULL END) [青蔬菜类 ], MAX(CASE B WHEN '生猛海鲜 ' THEN C ELSE NULL END) [生猛海鲜 ], MAX(CASE B WHEN '时尚热菜 ' THEN C ELSE NULL END) [时尚热菜 ], MAX(CASE B WHEN '鲜榨果汁 ' THEN C ELSE NULL END) [鲜榨果汁 ], MAX(CASE B WHEN '养生热饮 ' THEN C ELSE NULL END) [养生热饮 ], MAX(CASE B WHEN '消费合计 ' THEN C ELSE NULL END) [消费合计 ], MAX(CASE B WHEN '服务费 ' THEN C ELSE NULL END) [服务费 ], MAX(CASE B WHEN '抹零 ' THEN C ELSE NULL END) [抹零 ], MAX(CASE B WHEN '招待 ' THEN C ELSE NULL END) [招待 ], MAX(CASE B WHEN '折扣 ' THEN C ELSE NULL END) [折扣 ], MAX(CASE B WHEN '费用合计 ' THEN C ELSE NULL END) [费用合计 ], MAX(CASE B WHEN 'AR账单 ' THEN C ELSE NULL END) [AR账单 ], MAX(CASE B WHEN 'IC卡 ' THEN C ELSE NULL END) [IC卡 ], MAX(CASE B WHEN '挂房账 ' THEN C ELSE NULL END) [挂房账 ], MAX(CASE B WHEN '会议 ' THEN C ELSE NULL END) [会议 ], MAX(CASE B WHEN '刷卡 ' THEN C ELSE NULL END) [刷卡 ], MAX(CASE B WHEN '现金 ' THEN C ELSE NULL END) [现金 ], MAX(CASE B WHEN '应收账 ' THEN C ELSE NULL END) [应收账 ], MAX(CASE B WHEN '付款合计 ' THEN C ELSE NULL END) [付款合计 ] FROM 分类营业统计_主 WHERE E BETWEEN '" & CStr(DTPicker5.value) & "' AND '" & CStr(DT
發糞塗牆 2014-05-05
  • 打赏
  • 举报
回复
DTPicker5.value 传入了什么值?你这个貌似不是纯SQL啊
cyerp 2014-05-05
  • 打赏
  • 举报
回复
引用 11 楼 DBA_Huangzj 的回复:
晕,你的是2000啊?
我用的是2000,到底是什么原因啊,为什么把DTPicker5.value 直接改为 2014-5-1 就可以啊 谢谢 有办法帮帮我吗
發糞塗牆 2014-05-05
  • 打赏
  • 举报
回复
你的问题是变量不够存放你的字符,但是按5楼的说法: SELECT A AS 台号, MAX(CASE B WHEN '白酒红酒' THEN C ELSE NULL END) [白酒红酒], MAX(CASE B WHEN '刷卡 ' THEN C ELSE NULL END) [刷卡 ], MAX(CASE B WHEN '现金 ' THEN C ELSE NULL END) [现金 ], FROM 分类营业统计_主 WHERE E BETWEEN '" & CStr(DTPicker5.value) & "' AND '" & CStr(DT 这样的数据不应该超过8000啊,你的真实环境就是这样?
cyerp 2014-05-05
  • 打赏
  • 举报
回复
引用 11 楼 DBA_Huangzj 的回复:
晕,你的是2000啊?
sql2000
發糞塗牆 2014-05-05
  • 打赏
  • 举报
回复
晕,你的是2000啊?
cyerp 2014-05-05
  • 打赏
  • 举报
回复
引用 9 楼 DBA_Huangzj 的回复:
declare @sql varchar(max) set @sql = 'select A AS 台号' select @sql = @sql + ' , max(case B when ''' + B + ''' then C else NULL end) [' + B + ']' from (select distinct B,D from 分类营业统计_主 ) as a order by D set @sql = @sql + ' from 分类营业统计_主 where E between'+quotename('" & CStr(DTPicker5.value) & "','''')+'AND '+quotename('" & CStr(DTPicker6.value) & "','''')+' group by A' print(@SQL) 执行这个
服务器: 消息 170,级别 15,状态 1,行 1 第 1 行: 'max' 附近有语法错误。 服务器: 消息 137,级别 15,状态 1,行 3 必须声明变量 '@sql'。 服务器: 消息 137,级别 15,状态 1,行 3 必须声明变量 '@sql'。 服务器: 消息 156,级别 15,状态 1,行 4 在关键字 'as' 附近有语法错误。 服务器: 消息 137,级别 15,状态 1,行 4 必须声明变量 '@sql'。 服务器: 消息 137,级别 15,状态 1,行 4 必须声明变量 '@SQL'。
發糞塗牆 2014-05-05
  • 打赏
  • 举报
回复
declare @sql varchar(max) set @sql = 'select A AS 台号' select @sql = @sql + ' , max(case B when ''' + B + ''' then C else NULL end) [' + B + ']' from (select distinct B,D from 分类营业统计_主 ) as a order by D set @sql = @sql + ' from 分类营业统计_主 where E between'+quotename('" & CStr(DTPicker5.value) & "','''')+'AND '+quotename('" & CStr(DTPicker6.value) & "','''')+' group by A' print(@SQL) 执行这个
cyerp 2014-05-05
  • 打赏
  • 举报
回复
引用 6 楼 DBA_Huangzj 的回复:
declare @sql varchar(max)
什么意思啊
發糞塗牆 2014-05-05
  • 打赏
  • 举报
回复
另外你那刷卡和现金两个字后面的空格要去掉吧
發糞塗牆 2014-05-05
  • 打赏
  • 举报
回复
declare @sql varchar(max)
cyerp 2014-05-05
  • 打赏
  • 举报
回复
引用 3 楼 DBA_Huangzj 的回复:
declare @sql varchar(8000)
set @sql = 'select A AS 台号'
select @sql = @sql + ' , max(case B when ''' + B + ''' then C else NULL end) [' + B + ']'
from (select distinct B,D from 分类营业统计_主 ) as a order by D set @sql = @sql + ' from 分类营业统计_主 where E between'+quotename('" & CStr(DTPicker5.value) & "','''')+'AND '+quotename('" & CStr(DTPicker6.value) & "','''')+' group by A' print(@SQL)

执行一下,贴结果,另外回复请引用


SELECT A AS 台号, MAX(CASE B WHEN '白酒红酒' THEN C ELSE NULL END) [白酒红酒],
MAX(CASE B WHEN '刷卡 ' THEN C ELSE NULL END) [刷卡 ],
MAX(CASE B WHEN '现金 ' THEN C ELSE NULL END) [现金 ],
FROM 分类营业统计_主
WHERE E BETWEEN '" & CStr(DTPicker5.value) & "' AND '" & CStr(DT

print的结果不完整(WHERE E BETWEEN '" & CStr(DTPicker5.value) & "' AND '" & CStr(DT)



如果 我直接把“ CStr(DTPicker5.value) ” 改为时间“2014-5-1” print的结果就能显示完整,这是哪里错了?

SELECT A AS 台号, MAX(CASE B WHEN '白酒红酒' THEN C ELSE NULL END) AS 白酒红酒,
MAX(CASE B WHEN '刷卡 ' THEN C ELSE NULL END) AS [刷卡 ],
MAX(CASE B WHEN '现金 ' THEN C ELSE NULL END) AS [现金 ],
FROM dbo.分类营业统计_主
WHERE (E BETWEEN '2014-5-1' AND '2014-5-1')
GROUP BY A
  • 打赏
  • 举报
回复
自己print一下拼接出来 的sql,然后自己再调试下
發糞塗牆 2014-05-05
  • 打赏
  • 举报
回复
declare @sql varchar(8000)
  set @sql = 'select A  AS 台号'
  select   @sql = @sql + ' , max(case B when ''' + B + ''' then C else NULL end) [' + B + ']'  
 from  (select distinct B,D from 分类营业统计_主 ) as a  order by D  set @sql = @sql + ' from 分类营业统计_主 where E between'+quotename('" & CStr(DTPicker5.value) & "','''')+'AND '+quotename('" & CStr(DTPicker6.value) & "','''')+' group by A' print(@SQL)
执行一下,贴结果,另外回复请引用
cyerp 2014-05-05
  • 打赏
  • 举报
回复
declare @sql varchar(8000) set @sql = 'select A AS 台号' select @sql = @sql + ' , max(case B when ''' + B + ''' then C else NULL end) [' + B + ']' from (select distinct B,D from 分类营业统计_主 ) as a order by D set @sql = @sql + ' from 分类营业统计_主 where E between'+quotename('" & CStr(DTPicker5.value) & "','''')+'AND '+quotename('" & CStr(DTPicker6.value) & "','''')+' group by A' exec(@SQL) 为什么加了时间条件 就报错“by” E between'+quotename('" & CStr(DTPicker5.value) & "','''')+'AND '+quotename('" & CStr(DTPicker6.value) & "','''')+'
加载更多回复(3)

34,575

社区成员

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

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