******************求一条SQL****************

config_man 2014-08-21 05:21:15

如图。按城市分组。
当日期>今天,为“未上线”;
当日期<=今天,取其中ThemeId最大的,作为“已上线”;
其余为“已下线”(即日起<=今天,并且ThemdId不是最大的剩余所有数据)

备注:ThemeId为主键。日期实际只存年月日(时分秒部分都为0),所以日期对比可能只取日期部分进行对比,我自己会处理。

关于测试数据,很抱歉,没有权限,不太好提供。感谢。
图中的SQL如下:




SELECT
ThemeId,
CASE
WHEN CityId=2 THEN '上海'
WHEN CityId=1 THEN '北京'
WHEN CityId=32 THEN '广州'
WHEN CityId=30 THEN '深圳'
WHEN CityId=37 THEN '丽江'
ELSE ''
END CityName,
BeginDate,
CASE
WHEN BeginDate>GETDATE() THEN '未上线'
WHEN MAX(BeginDate) <=GETDATE() THEN '已上线'
ELSE '已下线'
END GroupThemeStatus
FROM
GHP_GroupTheme(NOLOCK)
GROUP BY
CityId,ThemeId,BeginDate


...全文
185 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2014-08-22
  • 打赏
  • 举报
回复
在 CASE 中做 SELECT MAX(),实在看不下去了。
DECLARE @今天 DateTime
SET @今天 = '2014-08-21' --发帖的日子
;
WITH GroupTheme (ThemeId, CityID, BeginDate)
AS (
/* 这里对 GHP_GroupTheme 进行 GROUP BY,形成下面的结果*/
SELECT 15,1,'2014-08-20' UNION ALL
SELECT 22,1,'2014-08-20' UNION ALL
SELECT 2,1,'2014-08-22' UNION ALL
SELECT 12,1,'2014-08-27' UNION ALL
SELECT 27,1,'2014-08-29' UNION ALL
SELECT 7,1,'2014-09-06' UNION ALL
SELECT 14,2,'2014-08-20' UNION ALL
SELECT 12,2,'2014-08-20' UNION ALL
SELECT 31,2,'2014-08-21' UNION ALL
SELECT 1,2,'2014-08-22' UNION ALL
SELECT 11,2,'2014-08-27' UNION ALL
SELECT 26,2,'2014-08-29'
),
CityInfo (CityID, [Name])
AS ( -- 这个最好做成字典表,以应对添加城市的情况
SELECT 1,N'北京' UNION ALL
SELECT 2,N'上海'
),
CityMax (CityID, ThemeId)
AS (
SELECT CityID, MAX(ThemeId)
FROM GroupTheme
WHERE BeginDate <= @今天
GROUP BY CityID
)
SELECT g.ThemeId,
c.Name,
g.BeginDate,
CASE WHEN g.BeginDate > @今天 THEN N'未上线'
WHEN g.ThemeId = cm.ThemeId THEN N'已上线'
ELSE N'已下线'
END GroupThemeStatus
FROM GroupTheme g
JOIN CityInfo c
ON c.CityID = g.CityID
JOIN CityMax cm
ON cm.CityID = g.CityID
ORDER BY
c.Name,g.BeginDate,g.ThemeId

    ThemeId Name BeginDate  GroupThemeStatus
----------- ---- ---------- ----------------
12 上海 2014-08-20 已下线
14 上海 2014-08-20 已下线
31 上海 2014-08-21 已上线
1 上海 2014-08-22 未上线
11 上海 2014-08-27 未上线
26 上海 2014-08-29 未上线
15 北京 2014-08-20 已下线
22 北京 2014-08-20 已上线
2 北京 2014-08-22 未上线
12 北京 2014-08-27 未上线
27 北京 2014-08-29 未上线
7 北京 2014-09-06 未上线
reenjie 2014-08-22
  • 打赏
  • 举报
回复
SELECT ThemeId, CASE WHEN CityId=2 THEN '上海' WHEN CityId=1 THEN '北京' WHEN CityId=32 THEN '广州' WHEN CityId=30 THEN '深圳' WHEN CityId=37 THEN '丽江' ELSE '' END CityName, BeginDate, CASE WHEN BeginDate>GETDATE() THEN '未上线' WHEN ThemeId=(select max(ThemeId) from GHP_GroupTheme as b where b.CityId=a.CityId ) THEN '已上线' ELSE '已下线' END GroupThemeStatus FROM GHP_GroupTheme(NOLOCK) as a
xiaodongni 2014-08-22
  • 打赏
  • 举报
回复
SELECT ThemeId, CASE WHEN CityId=2 THEN '上海' WHEN CityId=1 THEN '北京' WHEN CityId=32 THEN '广州' WHEN CityId=30 THEN '深圳' WHEN CityId=37 THEN '丽江' ELSE '' END CityName, BeginDate, CASE WHEN BeginDate>GETDATE() THEN '未上线' when themeld=(select MAX(themeld) from GHP_GroupTheme as g2 where g1.cityid=g2.cityid and g2.begindate<=GETDATE()) then '已上线' ELSE '已下线' END GroupThemeStatus FROM GHP_GroupTheme(NOLOCK) as g1
--小F-- 2014-08-22
  • 打赏
  • 举报
回复
建议不要用CASE WHEN 来判断 直接用IF ..ELSE来判断。
唐诗三百首 2014-08-21
  • 打赏
  • 举报
回复
不好意思,没有看懂.
习惯性蹭分 2014-08-21
  • 打赏
  • 举报
回复





SELECT 
	ThemeId,
	CASE 
        WHEN CityId=2 THEN '上海'
        WHEN CityId=1 THEN '北京'
        WHEN CityId=32 THEN '广州'
        WHEN CityId=30 THEN '深圳'
        WHEN CityId=37 THEN '丽江'
        ELSE ''
    END CityName,
    BeginDate,
    CASE 
		WHEN BeginDate>GETDATE() THEN '未上线'
		WHEN not exists(select * from GHP_GroupTheme where cityid=t.cityid and themeID>t.themeID) and  BeginDate  <=GETDATE() THEN '已上线'
		ELSE '已下线'
	END GroupThemeStatus
FROM
	GHP_GroupTheme(NOLOCK) t
 	
xiaodongni 2014-08-21
  • 打赏
  • 举报
回复
SELECT ThemeId, CASE WHEN CityId=2 THEN '上海' WHEN CityId=1 THEN '北京' WHEN CityId=32 THEN '广州' WHEN CityId=30 THEN '深圳' WHEN CityId=37 THEN '丽江' ELSE '' END CityName, BeginDate, CASE WHEN BeginDate>GETDATE() THEN '未上线' when themeld=(select MAX(themeld) from GHP_GroupTheme as g2 where g1.cityid=g2.cityid and g2.begindate<=GETDATE()) ELSE '已下线' END GroupThemeStatus FROM GHP_GroupTheme(NOLOCK) as g1 试试
config_man 2014-08-21
  • 打赏
  • 举报
回复
ThemeId CityName BeginDate GroupThemeStatus (No column name) 15 北京 2014-08-20 00:00:00.000 已下线 31 22 北京 2014-08-20 00:00:00.000 已下线 31 2 北京 2014-08-22 00:00:00.000 未上线 31 12 北京 2014-08-27 00:00:00.000 未上线 31 27 北京 2014-08-29 00:00:00.000 未上线 31 7 北京 2014-09-06 00:00:00.000 未上线 31
config_man 2014-08-21
  • 打赏
  • 举报
回复

ThemeId	CityName	BeginDate	                      GroupThemeStatus	(No column name)
15	                    北京	    2014-08-20 00:00:00.000	   已下线	                                  31
22	                    北京	    2014-08-20 00:00:00.000	   已下线	                                  31
2	                    北京	    2014-08-22 00:00:00.000	   未上线	                                  31
12                       北京	    2014-08-27 00:00:00.000	   未上线	                                  31
27	                    北京	    2014-08-29 00:00:00.000	   未上线	                                  31
7	                    北京	    2014-09-06 00:00:00.000	   未上线	                                  31
这是查询出的结果片段,其中第第二条应该是“已上线”
config_man 2014-08-21
  • 打赏
  • 举报
回复
引用 3 楼 spiritofdragon 的回复:
...终于明白需求了... (GetDate()处需要截断到日,你说会自己处理,我就不处理了)

SELECT 
    ThemeId,
    CASE 
        WHEN CityId=2 THEN '上海'
        WHEN CityId=1 THEN '北京'
        WHEN CityId=32 THEN '广州'
        WHEN CityId=30 THEN '深圳'
        WHEN CityId=37 THEN '丽江'
        ELSE ''
    END CityName,
    BeginDate,
    CASE 
        WHEN BeginDate>GETDATE() THEN '未上线'
        WHEN BeginDate=(select MAX(BeginDate) from GHP_GroupTheme g2 where BeginDate<=GETDATE() and g1.CityId=g2.CityId ) THEN '已上线'
        ELSE '已下线'
    END GroupThemeStatus
FROM
    GHP_GroupTheme g1 (NOLOCK)
不对哦。第二个when中应该包含ThemeId最大的条件
spiritofdragon 2014-08-21
  • 打赏
  • 举报
回复
...终于明白需求了... (GetDate()处需要截断到日,你说会自己处理,我就不处理了)

SELECT 
    ThemeId,
    CASE 
        WHEN CityId=2 THEN '上海'
        WHEN CityId=1 THEN '北京'
        WHEN CityId=32 THEN '广州'
        WHEN CityId=30 THEN '深圳'
        WHEN CityId=37 THEN '丽江'
        ELSE ''
    END CityName,
    BeginDate,
    CASE 
        WHEN BeginDate>GETDATE() THEN '未上线'
        WHEN BeginDate=(select MAX(BeginDate) from GHP_GroupTheme g2 where BeginDate<=GETDATE() and g1.CityId=g2.CityId ) THEN '已上线'
        ELSE '已下线'
    END GroupThemeStatus
FROM
    GHP_GroupTheme g1 (NOLOCK)
spiritofdragon 2014-08-21
  • 打赏
  • 举报
回复
其实没明白,你到底要的结果是啥?你给的SQL 是否是错误的,只是描述下你的需求而已? ThemeId既然是主键,且都放进Group by里了,貌似就没有必要Group by 了。。。
config_man 2014-08-21
  • 打赏
  • 举报
回复
关于未上线、已上线、已下线三种判断,请以上面帖子中的描述为依据,勿以“大于今天为未上线,等于今天为上线,小于今天为下线”进行判断,谢谢。

34,587

社区成员

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

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