2012-05-22 6 views
3

Я начинаю с данными, который выглядит следующим образом:Bucketing данных в SQL Server 2008

+----------+------------------+--------+ 
| specimen |  date  | bucket | 
+----------+------------------+--------+ 
| 31598D | 3/3/2010 11:38 |  10 | 
| A113899 | 2/10/2010 13:50 |  11 | 
| A121375 | 12/17/2010 10:06 |  2 | 
| A122115 | 6/14/2010 9:33 |  10 | 
| A122119 | 5/19/2010 10:08 |  3 | 
| A122124 | 6/30/2010 11:43 |  4 | 
| DD58834 | 6/17/2010 10:08 |  1 | 
| 31598A | 3/3/2010 11:36 |  10 | 
+----------+------------------+--------+ 

Я хотел бы знать, можно ли преобразовать его к распределению частот, как это:

enter image description here

Я бы использовал функцию pivot в SQL Server? Если да, то как?

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

спасибо за ваше руководство и время

+0

@marc_s пожалуйста, вы можете помочь Wiht это http://stackoverflow.com/questions/10711220/outputting-full-sequential-range-of-values ​​ –

ответ

1

Это проверялось, как я не экземпляр SQL Server под рукой, но он должен проиллюстрировать идею; вы можете использовать SUM() для оператора case для генерации необходимого вам распределения.

SELECT 
     [bucket] 
    , SUM(CASE WHEN DATEPART(MONTH,[date]) = 1 THEN 1 ELSE 0 END) AS [Jan] 
    -- repeat the above for each month 
FROM 
    [your_table] 
GROUP BY 
    [bucket] 
ORDER BY 
    [bucket] DESC 
+0

почему не просто поворот? – vittore

+0

не могли бы вы помочь с этим http://stackoverflow.com/questions/10711220/outputting-full-sequential-range-of-values ​​ –

1
select * from t 
pivot (
     count (*) for datepart(m, date) 
     in ([01],[02],[03],[04],[05], 
      [06],[07],[08],[09],[10],[11],[12]) 
) as CountSpec 

попробовать что

+0

Вы будете пропускать число ковшей, что дон В таблице нет. – Taryn

+0

Неверный синтаксис рядом с '*'. по счету (*) –

+0

изменить его на подсчет (ведро), например – vittore

3
WITH bm (maxbucket) AS 
     (
     SELECT MAX(bucket) 
     FROM mydata 
     ), 
     buckets (bucket) AS 
     (
     SELECT 1 
     UNION ALL 
     SELECT bucket + 1 
     FROM buckets 
     JOIN bm 
     ON  bucket < maxbucket 
     ) 
SELECT bucket, p.* 
FROM (
     SELECT b.bucket, DATEPART(month, dt) AS mon 
     FROM buckets b 
     LEFT JOIN 
       mydata m 
     ON  m.bucket = b.bucket 
     ) q 
PIVOT (
     COUNT(mon) 
     FOR 
     mon IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12]) 
     ) p 
+0

Большое вам спасибо. Я выполняю это заявление прямо сейчас, и это занимает некоторое время. это фактически вытаскивает данные из представления. возможно ли иметь индексы на виде? –

+0

@ АртёмЦарионов: зависит от определения определения: http://msdn.microsoft.com/library/ms191432.aspx – Quassnoi

+0

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

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