Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按2个不同的列日期和时间对数据进行分组,并后跟另一列_Sql_Sql Server - Fatal编程技术网

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执行此操作。