2010-08-20 3 views
1

HI, Использование SQL Server 2005 У меня есть следующий запрос:поворотное для двух колонок

SELECT 
contact_id  
,YEAR(date_created)   AS giftyear 
,SUM(amount_exc_vat)  AS year_total_xGA 
,SUM(amount_inc_vat)  AS year_total_inGA 
,COUNT(*) AS numGifts 
FROM gifts 
GROUP BY contact_id 
,Year(date_created) 

который возвращает данные, выглядит следующим образом:

contact_id | giftyear | year_total_xVAT |year_total_inVAT | numGifts 
id001  | 2006 | 17.00   |  21.79  |  4 
id001  | 2007 | 5.00   | 6.41   |  1 
id001  | 2008 | 5.00   |  6.41  |  1 

Затем я хочу повернуть эти данные есть таблица, похожая на это вместо этого

contact_id | gift_2006 | 2006_excVAT | 2006_incVAT | 2007gifts | 2007_excVAT | 2007_incVAT | gift_2008 | 2008_excvat | 2008_incvat 
id001  | 1  |  17.00  | 21.79  | 1  | 5.00  | 6.41   | 1  | 5.00  | 6.41 

Итак, где gift_2006 и т. д., по существу, является CASE sta Tement говоря, если contact_id дали в подарок в 2006 году затем присвоить 1 еще 0 - так что для одного контакта вся информация содержится в одном ряду

Заранее спасибо :)

ответ

2
SELECT 
contact_id, 
CASE WHEN COUNT(CASE WHEN YEAR(date_created) = 2006 THEN 1 END) > 0 THEN 1 ELSE 0 END AS gift_2006, 
SUM(CASE WHEN YEAR(date_created) = 2006 THEN amount_exc_vat END) AS [2006_excVAT] , 
SUM(CASE WHEN YEAR(date_created) = 2006 THEN amount_inc_vat END) AS [2006_incVAT] , 
CASE WHEN COUNT(CASE WHEN YEAR(date_created) = 2007 THEN 1 END) > 0 THEN 1 ELSE 0 END AS gift_2007, 
SUM(CASE WHEN YEAR(date_created) = 2007 THEN amount_exc_vat END) AS [2007_excVAT] , 
SUM(CASE WHEN YEAR(date_created) = 2007 THEN amount_inc_vat END) AS [2007_incVAT] , 
CASE WHEN COUNT(CASE WHEN YEAR(date_created) = 2008 THEN 1 END) > 0 THEN 1 ELSE 0 END AS gift_2008, 
SUM(CASE WHEN YEAR(date_created) = 2008 THEN amount_exc_vat END) AS [2008_excVAT] , 
SUM(CASE WHEN YEAR(date_created) = 2008 THEN amount_inc_vat END) AS [2008_incVAT] 
FROM gifts 
GROUP BY contact_id 
+0

Когда я пытаюсь это я получите сообщение о том, что date_created не входит в состав агрегации, и когда я добавляю его, он создает повторяющиеся строки для каждого contact_id. Кроме того, я слышал от некоторых примеров, что операторы CASE являются наиболее эффективными, если все эти вложенные операторы CASE замедляют работу? - Спасибо, – Dibstar

+0

@ Давин - Ну, это основная идея. Поскольку вы не предоставляли DDL (создание операторов таблицы) в своем сообщении, я не тестировал его в этом конце. Если вы отредактируете свой вопрос, чтобы включить скрипт create table для подарков, я сделаю это. Это единственный разумный способ сделать это. Оператор 'Pivot' является в основном синтаксическим сахаром для этого подхода. –

+0

Кстати, я просто испытал это в этом конце и вообще не получил такой ошибки. Вы уверены, что ничего не изменили? –

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