0

Я задал аналогичный вопрос для Concatenating rows from an alias computed column и получил ответ, который мне тогда нужен. Этот вопрос немного отличается тем, что один из столбцов - из другой таблицы. Ниже приведены таблицы и значение:
тарелки стола
конкатенация вычислений из разных столбцов таблицы в строку

Name   CookTimeMins Yield ServingsLeft 
Stroganoff 150   10 3 
Lasagna  180   24 3 
Chicken Carbonara 175  13 0 
Chicken Fettucine 15  3  6 
Chili Cheeseburger 10  2  1 
Chicken Fettucine 10  5  0 

, где урожайность и ServingsLeft Столбцы являются целыми столбцами и столбец CookTimeMin представляет собой столбец с плавающей точкой.

Dish2 стол

Name   TestIntCol 
Stroganoff 12 
Lasagna  12 
Chicken Carbonara 12 
Chicken Fettucine 12 
Chili Cheeseburger 12 
Chicken Fettucine 12 

То, что я хочу, чтобы достичь это:

Name     Laser 
Chicken Carbonara 0.00 
Chicken Fettucine 2.00,0.00 
Chili Cheeseburger 12.00 
Lasagna    4.00 
Stroganoff   4.00 

Однако то, что я получаю это:

Name     Laser 
Chicken Carbonara 0.00,2.00,4.00,12.00 
Chicken Fettucine 0.00,2.00,4.00,12.00 
Chili Cheeseburger 0.00,2.00,4.00,12.00 
Lasagna    0.00,2.00,4.00,12.00 
Stroganoff   0.00,2.00,4.00,12.00 

Мой код здесь:

select I.Name, 
--if we hit a divide by zero error, set to null and then set the null value to zero. 
(substring((select ', '+cast(ISNULL(cast(L.TestIntCol/NULLIF(K.ServingsLeft,0)as decimal(10,2)),0)as varchar(max)) from Dish2 L 
    join Dish K on L.Name = K.Name 
    --group on the calculation of the expression 
    where L.Name = K.Name group by ISNULL(cast(L.TestIntCol/NULLIF(K.ServingsLeft,0)as decimal(10,2)),0) FOR XML PATH('')), 2, 1000)) as Laser 
from Dish I 
join Dish2 J on I.Name = J.Name 
group by I.Name 

Я прочитал, что группировка по результату выражения должна помочь, но это не так. Я застрял на этом пару дней. Я посмотрел вокруг, но не нашел правильного ответа для моего сценария. Спасибо за помощь.

+0

спасибо за исправление кода. Я не мог найти, как правильно отформатировать его. – gamers542

+0

Можете ли вы объяснить, что представляет собой столбец Laser? – UnhandledExcepSean

+0

Это столбец с псевдонимом, который содержит результат вычисляемых столбцов. Я использую его как имя по умолчанию, когда я не могу думать о имени столбца. – gamers542

ответ

1

Вы можете использовать CTE, чтобы сделать вещи проще:

;WITH CTE AS (
    SELECT DISTINCT I.Name, 
      ISNULL(CAST(J.TestIntCol/NULLIF(I.ServingsLeft,0) AS DECIMAL(10,2)), 0) AS tempLaser 
    FROM Dish I 
    INNER JOIN Dish2 J ON I.Name = J.Name 
) 
SELECT 
    C.Name, STUFF((SELECT ', ' + + CAST([tempLaser] AS VARCHAR(MAX)) 
       FROM CTE 
       WHERE (Name = C.Name) 
       FOR XML PATH('')), 1, 2, '') AS Laser 
FROM CTE C 
GROUP BY C.Name 

Для получения требуемого набора результатов, приведенных в ОП, я должен был использовать DISTINCT внутри CTE так (Chicken Fettucine 12) повторяется дважды в выборочные данные, предоставленные в ОП.

+0

Это работало так, как я хотел. Отметьте как правильно. Вопрос: лучше ли использовать CTE, чем подзапросы? В моем реальном приложении я использую подзапросы для достижения тех вещей, которые я задал в вопросе. – gamers542

+0

@ gamers542 Я лично предпочитаю их по подзапросам, в таких случаях, когда 'CTE' используется более одного раза. Я думаю, что их производительность эквивалентна. Вы можете посмотреть здесь http://stackoverflow.com/questions/11169550/is-there-a-speed-difference-between-cte-sub-query-and-temporary-table –

Смежные вопросы