2

使用 SQL Server 2000

表格1

ID Date Value1 Value2

001 01/01/2012 100 0
001 02/01/2012 200 200
...
...
001 31/01/2012 250 0
002 01/01/2012 050 100
002 02/01/2012 100 0
...
002 31/01/2012 075
....

我想按日期(日期列)按 id 分组显示值(value1 列)

输出如

ID 01/01/2012 02/01/2012 ... 31/01/2012

001  100 200 .... 250
002  050 100 .... 075
.....

询问

DECLARE @loop int,@date Date,@sql nvarchar(4000)
DECLARE @TempTable TABLE
(
  [Date] DATE
)
INSERT INTO @TempTable SELECT DISTINCT [Date] FROM table1 ORDER BY [Date]
  SET @sql = ''
  SET @loop = 1
  WHILE (@loop<=31)
    BEGIN
        IF EXISTS(SELECT * FROM @TempTable WHERE DAY([Date])=@loop) 
        BEGIN
            SET @date = (SELECT [Date] FROM @TempTable WHERE DAY([Date])=@loop)
            SET @sql = @sql+ ',MAX(CASE CONVERT(nvarchar(10),[Date],103) WHEN '''+CONVERT(nvarchar(10),@date,103)+''' THEN [Value1] END) AS [DATE'+CONVERT(nvarchar(2),@loop)+']'
         END
         ELSE
            SET @sql = @sql+ ', NULL AS [DATE'+CONVERT(nvarchar(2),@loop)+']'
         SET @loop = @loop+1
    END 

EXEC('SELECT ID'+@sql+' FROM table1 GROUP BY ID')

上面的查询正在工作,从上面的查询中我想找到星期天,如果是星期天,那么日期列应该显示 value2 列中的值,否则 value1 列应该显示

这该怎么做。

需要查询帮助

4

2 回答 2

1

DATEPART 函数为您提供一周中的整数天。星期日 - 星期六变成 1 - 7。

试着用这个换行

SET @sql = @sql+ ',MAX(CASE CONVERT(nvarchar(10),[Date],103) WHEN '''+CONVERT(nvarchar(10),@date,103)+''' THEN CASE DATEPART(weekday,[Date])WHEN 1 THEN [Value1] ELSE [Value2] END END) AS [DATE'+CONVERT(nvarchar(2),@loop)+']'

每个 id 的总计算

SELECT ID,
SUM(CASE WHEN DATEPART(weekday,[Date]) <> 1 THEN [Value1] END) AS Value1,
SUM(CASE DATEPART(weekday,[Date]) WHEN 1 THEN [Value2] END) AS Value2,
FROM table1 GROUP BY ID
于 2012-05-23T12:17:55.520 回答
0

事实证明,您不需要迭代,也不需要动态脚本。考虑以下:

SELECT
  ID,
  Day1  = MAX(CASE D WHEN  1 THEN V END),
  Day2  = MAX(CASE D WHEN  2 THEN V END),
  Day3  = MAX(CASE D WHEN  3 THEN V END),
  Day4  = MAX(CASE D WHEN  4 THEN V END),
  Day5  = MAX(CASE D WHEN  5 THEN V END),
  Day6  = MAX(CASE D WHEN  6 THEN V END),
  Day7  = MAX(CASE D WHEN  7 THEN V END),
  Day8  = MAX(CASE D WHEN  8 THEN V END),
  Day9  = MAX(CASE D WHEN  9 THEN V END),
  Day10 = MAX(CASE D WHEN 10 THEN V END),
  Day11 = MAX(CASE D WHEN 11 THEN V END),
  Day12 = MAX(CASE D WHEN 12 THEN V END),
  Day13 = MAX(CASE D WHEN 13 THEN V END),
  Day14 = MAX(CASE D WHEN 14 THEN V END),
  Day15 = MAX(CASE D WHEN 15 THEN V END),
  Day16 = MAX(CASE D WHEN 16 THEN V END),
  Day17 = MAX(CASE D WHEN 17 THEN V END),
  Day18 = MAX(CASE D WHEN 18 THEN V END),
  Day19 = MAX(CASE D WHEN 19 THEN V END),
  Day20 = MAX(CASE D WHEN 20 THEN V END),
  Day21 = MAX(CASE D WHEN 21 THEN V END),
  Day22 = MAX(CASE D WHEN 22 THEN V END),
  Day23 = MAX(CASE D WHEN 23 THEN V END),
  Day24 = MAX(CASE D WHEN 24 THEN V END),
  Day25 = MAX(CASE D WHEN 25 THEN V END),
  Day26 = MAX(CASE D WHEN 26 THEN V END),
  Day27 = MAX(CASE D WHEN 27 THEN V END),
  Day28 = MAX(CASE D WHEN 28 THEN V END),
  Day29 = MAX(CASE D WHEN 29 THEN V END),
  Day30 = MAX(CASE D WHEN 30 THEN V END),
  Day31 = MAX(CASE D WHEN 31 THEN V END)
FROM (
  SELECT
    ID,
    V = CASE DATENAME(WEEKDAY, Date) WHEN 'Sunday' THEN Value2 ELSE Value1 END,
    D = DAY(Date)
  FROM Table1
  WHERE … /* perhaps, a condition to retrieve a specific month is due here */
) s
GROUP BY ID
;
于 2012-05-24T07:44:43.430 回答