2017-08-16 45 views
0

好吧,所以我有一個問題,如何解決下面的查詢獲取多行。我期待將具有相同「持續時間」的所有行合併到一行中。我敢肯定這是一個新手的錯誤,但我仍然是一個新手。謝謝你的幫助。當和多行的情況下

Select UPPERAGE, 
case when [DurationLower] <= 2 THEN [DurationLower] ELSE NULL END AS 'First 
trail year' , 
case when [DurationLower] >= 3 THEN [DurationLower] ELSE NULL END AS 'Next 
trail year', 
case when [DurationLower] <= 2 THEN Rate/100 ELSE NULL END AS 'First trail 
%', 
case when [DurationLower] >= 3 THEN Rate/100 ELSE NULL END AS 'Next trail %' 

From Picasso.PageToProduct_VW pp 
left join Picasso.PageToProductToRate_vw ppr on ppr.PageToProductID= 
pp.PageToProductID 
left join Picasso.ProductRates_VW r on ppr.ProductRatesID= r.ProductRatesID 

wHERE pp.PageID = '7686A1' 
and r.RateType = 'BASIS POINTS' 
Group by upperage 

enter image description here

我正在尋找的是行1 & 2被合併和行3 & 4是結合

+0

使用聚合函數 – scsimon

+0

你需要alias列根據值,如果是看到這個[鏈接](https://stackoverflow.com/questions/1583609/sql-alias-column-name-for-使用功能於case語句) – Shuddh

回答

1

我不知道這個當前查詢是如何工作的(除非你使用的是mysql,但截圖似乎是SQL Server)。

無論如何,你需要在CASE表達式中使用聚合函數(我使用SUM):

SELECT UPPERAGE, 
     SUM(CASE 
       WHEN [DurationLower] <= 2 THEN [DurationLower] 
       ELSE NULL 
      END) AS [First trail year], 
     SUM(CASE 
       WHEN [DurationLower] >= 3 THEN [DurationLower] 
       ELSE NULL 
      END) AS [Next trail year], 
     SUM(CASE 
       WHEN [DurationLower] <= 2 THEN Rate/100 
       ELSE NULL 
      END) AS [First trail %], 
     SUM(CASE 
       WHEN [DurationLower] >= 3 THEN Rate/100 
       ELSE NULL 
      END) AS [Next trail %] 
FROM Picasso.PageToProduct_VW pp 
LEFT JOIN Picasso.PageToProductToRate_vw ppr 
    ON ppr.PageToProductID = pp.PageToProductID 
LEFT JOIN Picasso.ProductRates_VW r 
    ON ppr.ProductRatesID = r.ProductRatesID 
WHERE pp.PageID = '7686A1' 
AND r.RateType = 'BASIS POINTS' 
GROUP BY upperage 
; 
0

你似乎有多個UPPERAGE值看起來相同。如果它是數字,那可能是因爲它們的差異很小。如果它是一個字符串,它可能是類似尾隨空格的東西。

假設值是數字,你可以嘗試:

Select floor(UPPERAGE) as upperAge, 
     max(case when [DurationLower] <= 2 THEN [DurationLower] END) AS First_ 
trail_year, 
     max(case when [DurationLower] >= 3 THEN [DurationLower] END) AS Next _trail_year, 
     max(case when [DurationLower] <= 2 THEN Rate/100 END) AS First_trail_%, 
     max(case when [DurationLower] >= 3 THEN Rate/100 END) AS Next_trail_percent 
From Picasso.PageToProduct_VW pp left join 
    Picasso.PageToProductToRate_vw ppr 
    on ppr.PageToProductID = pp.PageToProductID left join 
    Picasso.ProductRates_VW r 
    on ppr.ProductRatesID= r.ProductRatesID 
where pp.PageID = '7686A1' and r.RateType = 'BASIS POINTS' 
Group by floor(UPPERAGE) 

注:

  • 書面,查詢失敗了,因爲你必須在select未聚集列。
  • 我堅信單引號只能用於字符串和日期常量,而不能用於列別名。
  • 有些數據庫會進行整數除法 - 您應該瞭解數據庫的功能。你可能想要rate/100.0
  • 我選擇了max()作爲運算符來組合東西。 sum()也可能適用。