SQL Server-基于案例的透视语句

SQL Server-基于案例的透视语句,sql,sql-server,pivot,case,Sql,Sql Server,Pivot,Case,我有一张这样的桌子: Store Holiday Date_Index Temp 123 XMAS t_0 34.9 234 XMAS t_1 M 123 XMAS t_1 22.3 123 XMAS t_2 28.5 Store Holiday t_0 t_1 t_2

我有一张这样的桌子:

Store   Holiday    Date_Index     Temp
 123      XMAS         t_0         34.9
 234      XMAS         t_1          M
 123      XMAS         t_1         22.3
 123      XMAS         t_2         28.5
Store   Holiday    t_0     t_1      t_2
 123     XMAS      34.9    22.3     28.5
 234     XMAS      32.1    NULL     29.5
Select *
from
(
  select Store, Holiday, Date_Index, 
    CASE WHEN ISNumeric(Temp) = 1 THEN CAST(Temp AS DECIMAL(10, 2)) ELSE 0 END AS Temp
  from myTable
) as t
PIVOT
(
  sum(Temp)
  FOR DATE_INDEX IN ([t_0],[t_1],[t_2])
) as P;
我正试图将其转向如下内容:

Store   Holiday    Date_Index     Temp
 123      XMAS         t_0         34.9
 234      XMAS         t_1          M
 123      XMAS         t_1         22.3
 123      XMAS         t_2         28.5
Store   Holiday    t_0     t_1      t_2
 123     XMAS      34.9    22.3     28.5
 234     XMAS      32.1    NULL     29.5
Select *
from
(
  select Store, Holiday, Date_Index, 
    CASE WHEN ISNumeric(Temp) = 1 THEN CAST(Temp AS DECIMAL(10, 2)) ELSE 0 END AS Temp
  from myTable
) as t
PIVOT
(
  sum(Temp)
  FOR DATE_INDEX IN ([t_0],[t_1],[t_2])
) as P;
通过使用:

Select *
from
(
select Store, Holiday, Date_Index, Temp
from myTable
)
PIVOT
(
sum(CASE WHEN ISNUMERIC(Temp) = 1 THEN cast(Temp as decimal) ELSE NULL END)
FOR DATE_INDEX IN ([t_0],[t_1],[t_2])
) as PivotTable;

我的问题是Temp列包含字母和数字的混合。我试图以case语句的总和为中心,但收到了一条错误消息。如何正确补偿非数字字符?

一种方法是:不直接从表中选择/旋转,而是从CTE中选择,该CTE将所有非数字
Temp
值替换为
NULL

一种方法是:不直接从表中选择/旋转,从CTE中选择,该CTE将所有非数值的
Temp
值替换为
NULL

您不能这样做。但是,您可以在锚查询中这样做:

Store   Holiday    Date_Index     Temp
 123      XMAS         t_0         34.9
 234      XMAS         t_1          M
 123      XMAS         t_1         22.3
 123      XMAS         t_2         28.5
Store   Holiday    t_0     t_1      t_2
 123     XMAS      34.9    22.3     28.5
 234     XMAS      32.1    NULL     29.5
Select *
from
(
  select Store, Holiday, Date_Index, 
    CASE WHEN ISNumeric(Temp) = 1 THEN CAST(Temp AS DECIMAL(10, 2)) ELSE 0 END AS Temp
  from myTable
) as t
PIVOT
(
  sum(Temp)
  FOR DATE_INDEX IN ([t_0],[t_1],[t_2])
) as P;
我使用内置函数将这些非数值替换为0,并将整列转换为轴之前的
十进制。然后在
pivot
中,只需使用
SUM(temp)

结果:

| Store | Holiday |    t_0 |  t_1 |    t_2 |
|-------|---------|--------|------|--------|
|   123 |    XMAS |   34.9 | 22.3 |   28.5 |
|   234 |    XMAS | (null) |    0 | (null) |

你不能那样做。但是,您可以在锚查询中这样做:

Store   Holiday    Date_Index     Temp
 123      XMAS         t_0         34.9
 234      XMAS         t_1          M
 123      XMAS         t_1         22.3
 123      XMAS         t_2         28.5
Store   Holiday    t_0     t_1      t_2
 123     XMAS      34.9    22.3     28.5
 234     XMAS      32.1    NULL     29.5
Select *
from
(
  select Store, Holiday, Date_Index, 
    CASE WHEN ISNumeric(Temp) = 1 THEN CAST(Temp AS DECIMAL(10, 2)) ELSE 0 END AS Temp
  from myTable
) as t
PIVOT
(
  sum(Temp)
  FOR DATE_INDEX IN ([t_0],[t_1],[t_2])
) as P;
我使用内置函数将这些非数值替换为0,并将整列转换为轴之前的
十进制。然后在
pivot
中,只需使用
SUM(temp)

结果:

| Store | Holiday |    t_0 |  t_1 |    t_2 |
|-------|---------|--------|------|--------|
|   123 |    XMAS |   34.9 | 22.3 |   28.5 |
|   234 |    XMAS | (null) |    0 | (null) |

这里有另一种方法,可能是更简单的方法-

SELECT Store
      ,Holiday
      ,MAX(CASE WHEN Date_Index = 't_0' THEN Temp END) AS t_0
      ,MAX(CASE WHEN Date_Index = 't_1' THEN Temp END) AS t_1
      ,MAX(CASE WHEN Date_Index = 't_2' THEN Temp END) AS t_2
FROM YOUR_TABLE
GROUP BY Store
        ,Holiday

这里有另一种方法,可能是更简单的方法-

SELECT Store
      ,Holiday
      ,MAX(CASE WHEN Date_Index = 't_0' THEN Temp END) AS t_0
      ,MAX(CASE WHEN Date_Index = 't_1' THEN Temp END) AS t_1
      ,MAX(CASE WHEN Date_Index = 't_2' THEN Temp END) AS t_2
FROM YOUR_TABLE
GROUP BY Store
        ,Holiday