100分求指教 谢谢!

zjybushiren88888 2009-11-16 03:30:07
[Shop_Id] 商店ID [DailySales_Profit] 营业额 [Write_time] 记录时间 [Shop_Industry] 所属行业

[Shop_Id] [DailySales_Profit] [Write_time] [Shop_Industry]
1 20 2009-05-12 餐饮
1 30 2009-05-11 餐饮
1 20 2008-05-12 餐饮
2 15 2009-05-12 百货
2 25 2009-05-11 百货
2 30 2008-05-12 百货
..

最终结果比如查看2009-05-12的记录
得到的是
[Shop_Id] 今天销售额 去年今天销售额 今年累计(2009-01-01到2009-05-12) 去年累计(2008-01-01到2008-05-12)
1 20 20 sum sum
2 15 30 sum sum
...全文
218 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
fenshm 2009-11-17
  • 打赏
  • 举报
回复
帮顶~
laker_914 2009-11-17
  • 打赏
  • 举报
回复
还有没有其他方式的写法啊
zqtoo 2009-11-17
  • 打赏
  • 举报
回复
学习
kongbei 2009-11-16
  • 打赏
  • 举报
回复
只能up一下了。。。
fcuandy 2009-11-16
  • 打赏
  • 举报
回复
DECLATE @write_time DATETIME
SET @write_time ='2009-05-12'
SELECT ship_id,
SUM(CASE WHEN DATEDIFF(dd,write_time, @write_time)=0 THEN sales ELSE 0 END) sales_today,
SUM(CASE WHEN DATEADD(yy,-1,@write_time) = write_time THEN sales ELSE 0 END) sales_pre_year_today,
SUM(CASE WHEN write_time BETWEEN CONVERT(VARCHAR(5),@write_time,120) + '01-01' AND @write_time THEN sales ELSE 0 END) sales_YTD,
SUM(CASE WHEN write_time BETWEEN DATEADD(yy,-1,CONVERT(VARCHAR(5),@write_time,120) + '01-01') AND DATEADD(yy,-1,@write_time) THEN sales ELSE 0 END) sales_pre_YTD
FROM tb
WHERE write_time BETWEEN DATEADD(yy,-1,CONVERT(VARCHAR(5),@write_time,120) + '01-01') AND DATEADD(yy,-1,@write_time)
OR
write_time BETWEEN BETWEEN CONVERT(VARCHAR(5),@write_time,120) + '01-01' AND @write_time
GROUP BY ship_id
xuejie09242 2009-11-16
  • 打赏
  • 举报
回复
两种思路,一是建立一个临时表或表变量,然后一列列插入或更新,最后得到所有的记录。
二是用子查询,其实每一 列就是单独一个查询,前一种方法思路清晰,但步骤有些繁琐,第二种SQL语句会比较长,以后维护起来比较困难。
效率吗,可以比较一下。
lsd123 2009-11-16
  • 打赏
  • 举报
回复
.
jiangshun 2009-11-16
  • 打赏
  • 举报
回复

declare @s datetime
set @s='2009-05-12'

select [Shop_Id],
今天销售额=sum(case when datediff(dd,Write_time,@s)=0 then DailySales_Profit else 0 end),
去年今天销售额=sum(case when datediff(yy,Write_time,@s)=1 then DailySales_Profit else 0 end),
今年累计=sum(case when datediff(dd,Write_time,@s) between 0 and datepart(dy,@s) then DailySales_Profit else 0 end),
去年累计=sum(case when datediff(dd,dateadd(yy,-1,@s),Write_time) between 0 and datepart(dd,dateadd(yy,-1,@s)) then DailySales_Profit else 0 end)
from [TB]
group by Shop_Id
/*
Shop_Id 今天销售额 去年今天销售额 今年累计 去年累计
----------- ----------- ----------- ----------- -----------
1 20 20 50 20
2 15 30 40 30

(所影响的行数为 2 行)

*/
zjybushiren88888 2009-11-16
  • 打赏
  • 举报
回复
嗯 谢了。
sgtzzc 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zjybushiren88888 的回复:]
比如查看2009-05-12的记录
今年累计是(2009-01-01到2009-05-12)  去年累计是(2008-01-01到2008-05-12)
[/Quote]

12#已考虑该问题
好汉坡 2009-11-16
  • 打赏
  • 举报
回复
这个看的清楚


/*
最终结果比如查看2009-05-12的记录
得到的是
[Shop_Id] 今天销售额 去年今天销售额 今年累计(2009-01-01到2009-05-12) 去年累计(2008-01-01到2008-05-12)
1 20 20 sum sum
2 15 30 sum sum
*/

--> 测试数据: @tb
declare @tb table ([Shop_Id] int,[DailySales_Profit] int,[Write_time] datetime,[Shop_Industry] varchar(4))
insert into @tb
select 1,20,'2009-05-12','餐饮' union all
select 1,30,'2009-05-11','餐饮' union all
select 1,20,'2008-05-12','餐饮' union all
select 2,15,'2009-05-12','百货' union all
select 2,25,'2009-05-11','百货' union all
select 2,20,'2009-05-13','百货' union all ---添加test,
select 2,30,'2008-05-12','百货'

declare @time datetime

set @time='2009-5-12'

select [Shop_Id],
[今天销售额]=max(case when datediff(day,[Write_time],@time)=0 then [DailySales_Profit] else 0 end),
[去年今天销售额]=max(case when datediff(year,[Write_time],@time)=1 then [DailySales_Profit] else 0 end),
[今年累计]=sum(case when datediff(year,[Write_time],@time)=0 and datediff(day,[Write_time],@time)>=0 then [DailySales_Profit] else 0 end),
[去年累计]=sum(case when datediff(year,[Write_time],@time)=1 and datediff(day,[Write_time],dateadd(year,-1,@time))>=0 then [DailySales_Profit] else 0 end )
from @tb
group by [Shop_Id]

Shop_Id 今天销售额 去年今天销售额 今年累计 去年累计
----------- ----------- ----------- ----------- -----------
1 20 20 50 20
2 15 30 40(看这个) 30

(2 行受影响)
好汉坡 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 zjybushiren88888 的回复:]
累计不是全年的。
[/Quote]17不对吗
zjybushiren88888 2009-11-16
  • 打赏
  • 举报
回复
累计不是全年的。
zjybushiren88888 2009-11-16
  • 打赏
  • 举报
回复
比如查看2009-05-12的记录
今年累计是(2009-01-01到2009-05-12) 去年累计是(2008-01-01到2008-05-12)
好汉坡 2009-11-16
  • 打赏
  • 举报
回复

/*
最终结果比如查看2009-05-12的记录
得到的是
[Shop_Id] 今天销售额 去年今天销售额 今年累计(2009-01-01到2009-05-12) 去年累计(2008-01-01到2008-05-12)
1 20 20 sum sum
2 15 30 sum sum
*/

--> 测试数据: @tb
declare @tb table ([Shop_Id] int,[DailySales_Profit] int,[Write_time] datetime,[Shop_Industry] varchar(4))
insert into @tb
select 1,20,'2009-05-12','餐饮' union all
select 1,30,'2009-05-11','餐饮' union all
select 1,20,'2008-05-12','餐饮' union all
select 2,15,'2009-05-12','百货' union all
select 2,25,'2009-05-11','百货' union all
select 2,30,'2008-05-12','百货'

declare @time datetime

set @time='2009-5-12'

select [Shop_Id],
[今天销售额]=max(case when datediff(day,[Write_time],@time)=0 then [DailySales_Profit] else 0 end),
[去年今天销售额]=max(case when datediff(year,[Write_time],@time)=1 then [DailySales_Profit] else 0 end),
[今年累计]=sum(case when datediff(year,[Write_time],@time)=0 and datediff(day,[Write_time],@time)>=0 then [DailySales_Profit] else 0 end),
[去年累计]=sum(case when datediff(year,[Write_time],@time)=1 and datediff(day,[Write_time],dateadd(year,-1,@time))>=0 then [DailySales_Profit] else 0 end )
from @tb
group by [Shop_Id]

Shop_Id 今天销售额 去年今天销售额 今年累计 去年累计
----------- ----------- ----------- ----------- -----------
1 20 20 50 20
2 15 30 40 30

(2 行受影响)
zjybushiren88888 2009-11-16
  • 打赏
  • 举报
回复
3楼应该还要分下组麽 10楼的累计有问题哦
zjybushiren88888 2009-11-16
  • 打赏
  • 举报
回复
谢谢10楼
長胸為富 2009-11-16
  • 打赏
  • 举报
回复
学习
feixianxxx 2009-11-16
  • 打赏
  • 举报
回复
o/\o

看看
sgtzzc 2009-11-16
  • 打赏
  • 举报
回复

---测试数据---
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([Shop_Id] int,[DailySales_Profit] int,[Write_time] datetime,[Shop_Industry] varchar(4))
insert [tb]
select 1,20,'2009-05-12','餐饮' union all
select 1,30,'2009-05-11','餐饮' union all
select 1,20,'2008-05-12','餐饮' union all
select 2,15,'2009-05-12','百货' union all
select 2,25,'2009-05-11','百货' union all
select 2,30,'2008-05-12','百货'

---查询---
declare @dt datetime
set @dt='2009-05-12'
select
[Shop_Id],
今天销售额=sum(DailySales_Profit),
去年今天销售额=(select sum(DailySales_Profit) from tb where Shop_Id=t.Shop_Id and year(Write_time)=year(t.Write_time)-1 and month(Write_time)=month(t.Write_time) and day(Write_time)=day(t.Write_time)),
今年累计=(select sum(DailySales_Profit) from tb where Shop_Id=t.Shop_Id and year(Write_time)=year(t.Write_time) and Write_time<=@dt),
去年累计=(select sum(DailySales_Profit) from tb where Shop_Id=t.Shop_Id and year(Write_time)=year(t.Write_time)-1 and Write_time<=dateadd(yy,-1,@dt))
from
tb t
where
datediff(dd,Write_time,@dt)=0
group by
[Shop_Id]
,Write_time

---结果---
Shop_Id 今天销售额 去年今天销售额 今年累计 去年累计
----------- ----------- ----------- ----------- -----------
1 20 20 50 20
2 15 30 40 30

(所影响的行数为 2 行)
加载更多回复(11)
java编写的计算器,能实现加减乘除。 //***该梦幻计算器与Windows附件自带计算器的标准版功能、界面相仿***// //******但还不支持键盘操作,如有需要,下一次等级将满足你**********// import java.awt.*; import java.lang.*; import javax.swing.*; import javax.swing.event.*; import java.awt.event.*; import java.awt.Component.*; import java.awt.color.*; import java.text.DecimalFormat; //*****************************************************************************// //*****************************************************************************// public class Calculator implements ActionListener //导入动作监听接口 { //******************************// //*****设计计算器界面的单位*****// JFrame frame; //定义框架 JTextField textAnswer; //定义输出显示框 JPanel panel, panel1, panel2, panel3;//定义面板作为子容器,从而达到要求的界面效果 JMenuBar mainMenu; JTextField textMemory; JLabel labelMemSpace; //labelMemSpace单纯做摆设,控制面板的形状 JButton buttonBk, buttonCe, buttonC; JButton button[]; JButton buttonMC, buttonMR, buttonMS, buttonMAdd; JButton buttonDot, buttonAddAndSub, buttonAdd, buttonSub, buttonMul,buttonDiv, buttonMod; JButton buttonSqrt, buttonDao, buttonEqual; JMenu editMenu, viewMenu, helpMenu; JMenuItem copyItem, pasteItem, tItem, sItem, numberGroup, topHelp, aboutCal,myCollege; DecimalFormat df; //设置数据输出精度 boolean clickable; //控制当前能否按键 double memoryd; //使用内存中存储的数字 int memoryi; double vard, answerd; //用来保存double型数据的中间值(vard)和最后结果(answerd) short key = -1, prekey = -1; //key用来保存当前进行何种运算,prekey用来保存前次进行何种运算 boolean clear = false; String copy; //做复制用 JTextArea help; //帮助 JScrollPane scrollHelp; static boolean One =true; //******************// //*****构造函数开始*****// public Calculator() { clickable = true; answerd = 0; frame = new JFrame("梦幻计算器--SWE08008"); frame.setResizable(false);//不允许改变计算器的大小 frame.setLocation(250,150);//设置计算器的起始位置 frame.setBackground(Color.YELLOW); df = new DecimalFormat("0.##############"); //设置数据输出精度(对于double型值)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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