Предположим, у меня есть таблица, которая выглядит следующим образомАгрегирование Несколько столбцов в SQL
id | location | dateHired | dateRehired | dateTerminated
1 | 1 | 10/1/2011 | NULL | 12/1/2011
2 | 1 | 10/3/2011 | 11/1/2011 | 12/31/2011
3 | 5 | 10/5/2011 | NULL | NULL
4 | 5 | 10/5/2011 | NULL | NULL
5 | 7 | 11/5/2011 | NULL | 12/1/2011
6 | 10 | 11/2/2011 | NULL | NULL
, и я хотел, чтобы уплотнить, что в сводной таблице, такие, что:
location | date | hires | rehires | terms
1 | 10/1/2011 | 1 | 0 | 0
1 | 10/3/2011 | 1 | 0 | 0
1 | 11/1/2011 | 0 | 1 | 0
1 | 12/1/2011 | 0 | 0 | 1
1 | 12/31/2011 | 1 | 0 | 0
5 | 10/5/2011 | 2 | 0 | 0
т.д.
- как бы выглядел SQL? Я думал, что это было бы чем-то вроде:
SELECT
e.location
, -- ?
,SUM(CASE WHEN e.dateHired IS NOT NULL THEN 1 ELSE 0 END) AS Hires
,SUM(CASE WHEN e.dateRehired IS NOT NULL THEN 1 ELSE 0 END) As Rehires
,SUM(CASE WHEN e.dateTerminated IS NOT NULL THEN 1 ELSE 0 END) As Terms
FROM
Employment e
GROUP BY
e.Location
,--?
Но я не очень заинтересован, если это абсолютно правильно или нет?
EDIT - это для SQL 2008 R2.
Кроме того,
INNER JOIN на сегодняшний день столбцов предполагает, что есть значения для всех трех категорий, что ложно; которая является первоначальной проблемой, которую я пытался решить. Я думал о чем-то вроде COALESCE, но это тоже не имеет смысла.
Это может помочь указать, какие СУБД вы используете. – Marc
Вместо использования CASE в строке попробуйте использовать функцию ISNULL(), попробуйте использовать COUNT, а не SUM. Я предполагаю SQL Server. –
Исправить, SQL Server. Моя вина. – Randster