name time money
a 上月 18
a 本月 20
b 上月 22
b 本月 16
c 上月 10
c 本月 5
单条查询 是 select money form where name='a' and time='上月'
select money form where name='a' and time='下月'
现需要合并语句 根据单独条件把所有money合并成一条
结果 18 20 22 16 10 5 查出的是这一条数据
不是单纯列结果组合成一条数据 要单独根据条件拼接
13 个解决方案
#1
什么叫做根据条件拼接?根据什么条件来拼?
#2
使用group by name 来进行分组
#3
整理一下结果看看?
#4
结果在问题中说的很明了 根据 select money form where name='a' and time='上月' 这样的条件语句 查询的结果money 合并成一行数据 结果 18 20 22 16 10 5
我这边不能操作到数据库 无法去写存错过程或重编视图 很少做sql这类的项目 一时间找不到解决办法
我这边不能操作到数据库 无法去写存错过程或重编视图 很少做sql这类的项目 一时间找不到解决办法
#5
我的意思是说,比如18 20 22。。。这些,是一列还是多列?
#6
根据 这样的 单条查询 select money form where name='a' and time='上月' 查询出money 合并money结果到一行数据 结果 18 20 22 16 10 5
#7
一条数据 一行 多列
自己知道每列名 nameA1 nameA2 nameB1 nameB2
18 20 22 16
自己知道每列名 nameA1 nameA2 nameB1 nameB2
18 20 22 16
#8
这样吗?
----------------------------------------------------------------
-- Author :DBA_Huangzj(發糞塗牆)
-- Date :2014-03-03 10:21:28
-- Version:
-- Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64)
-- Dec 28 2012 20:23:12
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
--
----------------------------------------------------------------
--> 测试数据:[test]
if object_id('[test]') is not null drop table [test]
go
create table [test]([name] varchar(1),[time] varchar(4),[money] int)
insert [test]
select 'a','上月',18 union all
select 'a','本月',20 union all
select 'b','上月',22 union all
select 'b','本月',16 union all
select 'c','上月',10 union all
select 'c','本月',5
--------------开始查询--------------------------
declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename('Money')+'=max(case when [name]='+quotename([name],'''')+' and [time]='+quotename([time],'''')+' then [money] else 0 end)'
from [test] group by [name],[time]
exec('select [name],[time]'+@s+' from [test] where name=''a'' and time=''上月'' group by [name],[time]')
----------------结果----------------------------
/*
name time Money Money Money Money Money Money
---- ---- ----------- ----------- ----------- ----------- ----------- -----------
a 上月 0 18 0 0 0 0
*/
#9
----------------------------------------------------------------
-- Author :DBA_Huangzj(發糞塗牆)
-- Date :2014-03-03 10:21:28
-- Version:
-- Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64)
-- Dec 28 2012 20:23:12
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
--
----------------------------------------------------------------
--> 测试数据:[test]
if object_id('[test]') is not null drop table [test]
go
create table [test]([name] varchar(1),[time] varchar(4),[money] int)
insert [test]
select 'a','上月',18 union all
select 'a','本月',20 union all
select 'b','上月',22 union all
select 'b','本月',16 union all
select 'c','上月',10 union all
select 'c','本月',5
--------------开始查询--------------------------
declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename('name'+name+CAST(ROW_NUMBER()OVER(PARTITION BY name ORDER BY getdate()) AS VARCHAR))+'=max(case when [name]='+quotename([name],'''')+' and [time]='+quotename([time],'''')+' then [money] else 0 end)'
from [test] group by [name],[time]
exec('select [name],[time]'+@s+' from [test] where name=''a'' and time=''上月'' group by [name],[time]')
----------------结果----------------------------
/*
name time namea1 namea2 nameb1 nameb2 namec1 namec2
---- ---- ----------- ----------- ----------- ----------- ----------- -----------
a 上月 0 18 0 0 0 0
*/
#10
不用 name 和time 列
你这样也太复杂了 老板一直让我尽量别用函数 或许客户那边不支持 我看了别人给我这样的
select a.money+''+b.money+''+c.money... from ((select money from where )as a ,(select money from where )as b...)
可行吗
你这样也太复杂了 老板一直让我尽量别用函数 或许客户那边不支持 我看了别人给我这样的
select a.money+''+b.money+''+c.money... from ((select money from where )as a ,(select money from where )as b...)
可行吗
#11
我这个是动态,你那个是穷举
#12
哎 这也是个问题额 数据量少还好说 这要是数据量多了 可咋整
#13
所以要用动态
#1
什么叫做根据条件拼接?根据什么条件来拼?
#2
使用group by name 来进行分组
#3
整理一下结果看看?
#4
结果在问题中说的很明了 根据 select money form where name='a' and time='上月' 这样的条件语句 查询的结果money 合并成一行数据 结果 18 20 22 16 10 5
我这边不能操作到数据库 无法去写存错过程或重编视图 很少做sql这类的项目 一时间找不到解决办法
我这边不能操作到数据库 无法去写存错过程或重编视图 很少做sql这类的项目 一时间找不到解决办法
#5
我的意思是说,比如18 20 22。。。这些,是一列还是多列?
#6
根据 这样的 单条查询 select money form where name='a' and time='上月' 查询出money 合并money结果到一行数据 结果 18 20 22 16 10 5
#7
一条数据 一行 多列
自己知道每列名 nameA1 nameA2 nameB1 nameB2
18 20 22 16
自己知道每列名 nameA1 nameA2 nameB1 nameB2
18 20 22 16
#8
这样吗?
----------------------------------------------------------------
-- Author :DBA_Huangzj(發糞塗牆)
-- Date :2014-03-03 10:21:28
-- Version:
-- Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64)
-- Dec 28 2012 20:23:12
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
--
----------------------------------------------------------------
--> 测试数据:[test]
if object_id('[test]') is not null drop table [test]
go
create table [test]([name] varchar(1),[time] varchar(4),[money] int)
insert [test]
select 'a','上月',18 union all
select 'a','本月',20 union all
select 'b','上月',22 union all
select 'b','本月',16 union all
select 'c','上月',10 union all
select 'c','本月',5
--------------开始查询--------------------------
declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename('Money')+'=max(case when [name]='+quotename([name],'''')+' and [time]='+quotename([time],'''')+' then [money] else 0 end)'
from [test] group by [name],[time]
exec('select [name],[time]'+@s+' from [test] where name=''a'' and time=''上月'' group by [name],[time]')
----------------结果----------------------------
/*
name time Money Money Money Money Money Money
---- ---- ----------- ----------- ----------- ----------- ----------- -----------
a 上月 0 18 0 0 0 0
*/
#9
----------------------------------------------------------------
-- Author :DBA_Huangzj(發糞塗牆)
-- Date :2014-03-03 10:21:28
-- Version:
-- Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64)
-- Dec 28 2012 20:23:12
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
--
----------------------------------------------------------------
--> 测试数据:[test]
if object_id('[test]') is not null drop table [test]
go
create table [test]([name] varchar(1),[time] varchar(4),[money] int)
insert [test]
select 'a','上月',18 union all
select 'a','本月',20 union all
select 'b','上月',22 union all
select 'b','本月',16 union all
select 'c','上月',10 union all
select 'c','本月',5
--------------开始查询--------------------------
declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename('name'+name+CAST(ROW_NUMBER()OVER(PARTITION BY name ORDER BY getdate()) AS VARCHAR))+'=max(case when [name]='+quotename([name],'''')+' and [time]='+quotename([time],'''')+' then [money] else 0 end)'
from [test] group by [name],[time]
exec('select [name],[time]'+@s+' from [test] where name=''a'' and time=''上月'' group by [name],[time]')
----------------结果----------------------------
/*
name time namea1 namea2 nameb1 nameb2 namec1 namec2
---- ---- ----------- ----------- ----------- ----------- ----------- -----------
a 上月 0 18 0 0 0 0
*/
#10
不用 name 和time 列
你这样也太复杂了 老板一直让我尽量别用函数 或许客户那边不支持 我看了别人给我这样的
select a.money+''+b.money+''+c.money... from ((select money from where )as a ,(select money from where )as b...)
可行吗
你这样也太复杂了 老板一直让我尽量别用函数 或许客户那边不支持 我看了别人给我这样的
select a.money+''+b.money+''+c.money... from ((select money from where )as a ,(select money from where )as b...)
可行吗
#11
我这个是动态,你那个是穷举
#12
哎 这也是个问题额 数据量少还好说 这要是数据量多了 可咋整
#13
所以要用动态