Как перенести из строки в столбец на основе условий в SQL Server? - PullRequest
0 голосов
/ 29 октября 2019

У меня есть таблица, которая содержит эти четыре столбца - тип почвы, общее количество часов, объем и месяц-год. ​​

Я предложил два запроса для генерации общего количества часов и общего объема по типу почвы на основена месяц-год состояние.

Ниже приведены мои результаты:

Общее количество часов в зависимости от типа почвы:

SELECT 
    [Soil Type], [Month/Year],
    SUM([Total Hour]) AS 'Total_Hour' 
FROM 
    OVERALL_SUMMARY_ORIGINAL 
WHERE 
    [Month/Year] = '2019-10-01' 
GROUP BY 
    [Soil Type], [Month/Year] 
ORDER BY 
    [Soil Type]

Результат:

enter image description here

Общий объем по типу почвы:

SELECT 
    [Soil Type], [Month/Year],
    SUM([Volume]) AS 'Total Volume' 
FROM 
    OVERALL_SUMMARY_ORIGINAL 
WHERE 
    [Month/Year] = '2019-10-01' 
GROUP BY 
    [Soil Type], [Month/Year] 
ORDER BY 
    [Soil Type]

Выход:

enter image description here

Я пытался выяснить,как объединить эти запросы таким образом, чтобы оператор SQL сначала проверил, если общий объем этого типа почвы> 10000, и если он удовлетворяет условию, он разделит общий объем на общее количество часов этого типа почвы. Затем SQL должен транспонировать столбец типа почвы в строку, как показано ниже:

enter image description here

Я пытался использовать функцию SQL PIVOT, но не смог получить вышеуказанный выводчто мне нужноКто-нибудь может помочь? Спасибо

1 Ответ

0 голосов
/ 29 октября 2019

Если я правильно понимаю вашу проблему, попробуйте это:


declare @product table(
 [Soil Type] varchar(50),
 [Month/Year] smalldatetime,
 [Total Hour] int,
 [Volume] int
)

insert into @product values ('Clay', '20190101', 2, 20)
insert into @product values ('Clay', '20190101', 3, 10)
insert into @product values ('Sandy', '20190101', 4, 10)
insert into @product values ('Sandy', '20190201', 2, 25)
insert into @product values ('Clay', '20190301', 8, 40)
insert into @product values ('Mixed', '20190101', 2, 25)
insert into @product values ('Mixed', '20190102', 1, 20)
insert into @product values ('Sand', '20190101', 3, 30)
insert into @product values ('Sand', '20190101', 1, 2)
insert into @product values ('Clay', '20190101', 1, 15)


Select [date], Clay, Mixed, Sand, Sandy
FROM(
SELECT 
    [Soil Type], [Month/Year] as [date],
    SUM([Volume]) / SUM([Total Hour]) as _data
FROM 
   @product
GROUP BY 
    [Soil Type], [Month/Year]
HAVING SUM([Volume])>30) x
PIVOT (
  SUM(_data) FOR [Soil Type] IN (Clay, Mixed, Sand, Sandy)
) pvt
...