2016-08-23 220 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