2016-08-23 187 views
0

选择行我有以下在case语句

YEAR_WW 
2016-23 
2016-24 
2016-25 
2016-26 
2016-27 
2016-28 
2016-29 
2016-30 
2016-31 
2016-32 
2016-33 
2016-34 
2016-35 

a我有,从表中的数据拉到定义的另一个表中的case语句。

SELECT Family,Value,YEAR_WW 
      ,weekly_qty = CASE WHEN YEAR_WW = '2016-23' THEN week1 
          WHEN YEAR_WW = '2016-24' THEN week2 
          WHEN YEAR_WW = '2016-25' THEN week3 
          WHEN YEAR_WW = '2016-26' THEN week4 
          WHEN YEAR_WW = '2016-27' THEN week5 
          WHEN YEAR_WW = '2016-28' THEN week6 
          WHEN YEAR_WW = '2016-29' THEN week7 
          WHEN YEAR_WW = '2016-30' THEN week8 
          WHEN YEAR_WW = '2016-31' THEN week9 
          WHEN YEAR_WW = '2016-32' THEN week10 
          WHEN YEAR_WW = '2016-33' THEN week11 
          WHEN YEAR_WW = '2016-34' THEN week12 
          ELSE week13 END 
FROM sample_table 

而不是硬的情况下声明编码表a值,有没有指定的case语句中的行数的方法吗?即:

WHEN YEAR_WW = [first_row] THEN week1 
WHEN YEAR_WW = [second row] THEN week2... 
+0

你使用MySQL?代码看起来不像MySQL。另外,“week1”,“week2”等等是什么。这些列是? –

+0

我不认为有像你问的东西。尽管你可以用一种有点冒险的方式,将破折号后面的子字符串转换为整数,然后从中减去22来获得你所描述的星期数。 – rgoliveira

+0

你的意思是写first_row是什么意思?如果您不会在查询中指定YEAR_WW中的数据,则可以在结果中插入任何星期*。 – AstraSerg

回答

1

如果我已经正确理解你的示例表;

我想你可以使用ROW_NUMBER()

SELECT Family, Value, YEAR_WW 
    , CONCAT('week', ISNULL(CONVERT(VARCHAR, i),13)) 
FROM sample_table X 
LEFT JOIN (
      SELECT ROW_NUMBER() OVER(ORDER BY YEAR_WW) AS i, YEAR_WW 
      FROM a 
      ) Y 
ON X.weekly_qty = Y.YEAR_WW 

而且要与订货安全,您可能需要使用ORDER BY CONVERT(INT, LEFT(YEAR_WW,4)*52)+CONVERT(INT, RIGHT(YEAR_WW,2)) ,而不是只是ORDER BY YEAR_WW