Sql 按2个不同的列日期和时间对数据进行分组,并后跟另一列
下面是输出数据、日期和时间的查询Sql 按2个不同的列日期和时间对数据进行分组,并后跟另一列,sql,sql-server,Sql,Sql Server,下面是输出数据、日期和时间的查询 结果: CurrDate item WeekStartingSunday WeekEndingSaturday ------------------------------------------------------------------------------ 2013-05-31 14:14:26.613 abc 2013-05-26 2013-06-01
结果:
CurrDate item WeekStartingSunday WeekEndingSaturday
------------------------------------------------------------------------------
2013-05-31 14:14:26.613 abc 2013-05-26 2013-06-01
2013-06-01 14:14:26.613 def 2013-05-26 2013-06-01
2013-06-02 14:14:26.613 abc 2013-06-02 2013-06-08
2013-06-03 14:14:26.613 abc 2013-06-02 2013-06-08
2013-06-04 14:14:26.613 987 2013-06-02 2013-06-08
2013-06-05 14:14:26.613 abc 2013-06-02 2013-06-08
2013-06-06 14:14:26.613 abc 2013-06-02 2013-06-08
2013-06-07 14:14:26.613 abc 2013-06-02 2013-06-08
下表是期望的结果,我想将结果输出到如下表中:
2013-05-26 to 2013-06-01
---------------------------
2013-05-31 abc
2013-06-01 def
2013-06-02 to 2013-06-08
---------------------------
2013-06-02 abc
2013-06-03 abc
2013-06-04 987
2013-06-05 abc
2013-06-06 abc
2013-06-07 abc
我很困惑,如何才能做到这一点?这是针对SQL SERVER 2005的。试试这个-
查询:
DECLARE @date DATETIME
SELECT @date = CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
DECLARE @SQL NVARCHAR(MAX)
;WITH cte AS
(
SELECT
a.CurrDate
, a.item
, WeekStartingSunday = DATEADD(DAY, 1 - DATEPART(WEEKDAY, CurrDate), CurrDate)
, WeekEndingSaturday = DATEADD(DAY, 7 - DATEPART(WEEKDAY, CurrDate), CurrDate)
FROM (
SELECT item = 'abc', CurrDate = @date
UNION ALL
SELECT 'def', @date +1
UNION ALL
SELECT 'abc', @date +2
UNION ALL
SELECT 'abc', @date +3
UNION ALL
SELECT '987', @date +4
UNION ALL
SELECT 'abc', @date +5
UNION ALL
SELECT 'abc', @date +6
UNION ALL
SELECT 'abc', @date +7
) a
)
SELECT @SQL = (
SELECT CHAR(13) +
STUFF((
SELECT ' UNION ALL SELECT ''' + CONVERT(VARCHAR(10), CurrDate, 111) + ' ' + item + ''''
FROM cte c2
WHERE c2.CurrDate BETWEEN c.WeekStartingSunday AND c.WeekEndingSaturday
ORDER BY CurrDate
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 18,
'SELECT ['
+ CONVERT(VARCHAR(10), WeekStartingSunday, 111)
+ ' to '
+ CONVERT(VARCHAR(10), WeekEndingSaturday, 111) + '] = ')
FROM (
SELECT DISTINCT c.WeekStartingSunday, c.WeekEndingSaturday
FROM cte c
)c
ORDER BY WeekStartingSunday
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
EXEC sys.sp_executesql @SQL
2013/06/02 to 2013/06/08
------------------------
2013/06/03 abc
2013/06/04 def
2013/06/05 abc
2013/06/06 abc
2013/06/07 987
2013/06/08 abc
2013/06/09 to 2013/06/15
------------------------
2013/06/09 abc
2013/06/10 abc
结果:
DECLARE @date DATETIME
SELECT @date = CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
DECLARE @SQL NVARCHAR(MAX)
;WITH cte AS
(
SELECT
a.CurrDate
, a.item
, WeekStartingSunday = DATEADD(DAY, 1 - DATEPART(WEEKDAY, CurrDate), CurrDate)
, WeekEndingSaturday = DATEADD(DAY, 7 - DATEPART(WEEKDAY, CurrDate), CurrDate)
FROM (
SELECT item = 'abc', CurrDate = @date
UNION ALL
SELECT 'def', @date +1
UNION ALL
SELECT 'abc', @date +2
UNION ALL
SELECT 'abc', @date +3
UNION ALL
SELECT '987', @date +4
UNION ALL
SELECT 'abc', @date +5
UNION ALL
SELECT 'abc', @date +6
UNION ALL
SELECT 'abc', @date +7
) a
)
SELECT @SQL = (
SELECT CHAR(13) +
STUFF((
SELECT ' UNION ALL SELECT ''' + CONVERT(VARCHAR(10), CurrDate, 111) + ' ' + item + ''''
FROM cte c2
WHERE c2.CurrDate BETWEEN c.WeekStartingSunday AND c.WeekEndingSaturday
ORDER BY CurrDate
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 18,
'SELECT ['
+ CONVERT(VARCHAR(10), WeekStartingSunday, 111)
+ ' to '
+ CONVERT(VARCHAR(10), WeekEndingSaturday, 111) + '] = ')
FROM (
SELECT DISTINCT c.WeekStartingSunday, c.WeekEndingSaturday
FROM cte c
)c
ORDER BY WeekStartingSunday
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
EXEC sys.sp_executesql @SQL
2013/06/02 to 2013/06/08
------------------------
2013/06/03 abc
2013/06/04 def
2013/06/05 abc
2013/06/06 abc
2013/06/07 987
2013/06/08 abc
2013/06/09 to 2013/06/15
------------------------
2013/06/09 abc
2013/06/10 abc
您可以检索“两级”结果集。。。但您可以在结果集中添加一列,每行上都有“2013-05-06至2013-06-01”或“2013-06-02至2013-02-08”。够了吗?@……不太明白你想要的结果集不是表。你能澄清你的问题吗?你想在哪里显示这些数据(WinForms、Web、Excel…)?因为它看起来像是接口层的作业,而不是SQL Server查询。2013-05-06来自哪里(2013-05-06至2013-06-01)?我更愿意为此使用表示层,而不是通过tsql执行此操作。