2015-11-28 5 views
-4

У меня есть таблицаSQL сводной таблицы (дата, строка)

enter image description here

Select * from Table1. 

Как я могу написать выбрать, чтобы выглядеть как таблица 2?

enter image description here

Диапазон дат выбирается пользователем и часов столбец строкового типа.

Пример: Пользователь хочет получить отчет о часах для каждого рабочего между 1.1.2015 и 1.3.2015. Итак, он вводит FROM 1.1.2015 (dateTime picker) и TO 1.3.2015 (dateTime picker).

+0

В каких СУБД для этого? Добавьте тег, чтобы указать, используете ли вы 'mysql',' postgresql', 'sql-server',' oracle' или 'db2' - или что-то еще. –

+0

Извините, это для MS SQL – hurikhan

ответ

1

Вы можете использовать синтаксис PIVOT с помощью MIN или MAX как agregation для столбца HOURS, учитывая, что в этом случае он извлекает одно значение за WORKER/DATE. Надеюсь, это сработает для вас.

declare @str varchar(MAX) 
declare @q varchar(MAX) 
declare @fromDate date 
declare @toDate date 

set @fromDate ='2015-01-01' 
set @toDate ='2015-03-01' 
set @str='' 
select @str = @str + '[' + cast(DATE as varchar) + '],' 
from (select distinct DATE from Table1 where DATE between @fromDate and @toDate) as A 

set @q = 
'SELECT WORKER, '+left(@str,len(@str)-1)+' 
FROM 
(SELECT WORKER, DATE, HOURS 
FROM Table1) p 
PIVOT 
(
MIN (HOURS) 
FOR [DATE] IN 
('+left(@str,len(@str)-1)+') 
) AS pvt' 
exec (@q) 
+0

Я не могу использовать функцию MIN, если столбец HOURS - это строка. И я также нуждаюсь в любом интервале дат, а не только в течение 2 дней. – hurikhan

+0

Вы можете использовать MIN/MAX для столбца строки в SQL. Для отдельных дат единственной идеей, которую я имею, является использование динамического запроса. Я только что отредактировал свой ответ. Надеюсь, он работает – pcofre

+0

Он работает, спасибо, но я не знаю, как изменить его, чтобы принимать входные значения, поэтому пользователь может ввести интервал дат от - до. – hurikhan

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