Almacenamiento de datos en SQL Server 2008

Estoy comenzando con datos que se ven así:

+----------+------------------+--------+
| 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 |
+----------+------------------+--------+

Me gustaría saber si es posible transformarlo a una distribución de frecuencias como esta:

enter image description here

¿Usaría el pivot función en SQL Server? ¿Si es así, cómo?

Tenga en cuenta que tengo acceso a SSRS y puedo usarlo como un recurso para enfrentar este desafío.

Muchas gracias por tu orientación y tiempo

preguntado el 22 de mayo de 12 a las 21:05

@marc_s ¿puedes ayudarme con esto? stackoverflow.com/questions/10711220/… -

3 Respuestas

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

contestado el 22 de mayo de 12 a las 22:05

Muchas gracias. Estoy ejecutando esta declaración en este momento y está tardando un tiempo. esto en realidad está extrayendo datos de una vista. ¿Es posible tener índices en una vista? - Alex Gordon

@АртёмЦарионов: depende de la definición de la vista: msdn.microsoft.com/library/ms191432.aspx - quassnoi

frio. esto ha estado funcionando durante 15 minutos y todavía no hay resultados, ¿puede sugerirme qué puedo hacer para acelerarlo? - Alex Gordon

¿O cree que tal vez sería mejor dejar que SSRS maneje el pivote y solo alimentar a ssrs con la vista? - Alex Gordon

@АртёмЦарионов: No puedo saberlo sin ver la definición de la vista. Solo prueba en ambos sentidos. - quassnoi

Esto no se ha probado, ya que no tengo una instancia de SQL Server a mano, pero debería ilustrar la idea; puede SUMAR () sobre una declaración de caso para generar la distribución que desea.

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

contestado el 22 de mayo de 12 a las 21:05

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

trata eso

contestado el 22 de mayo de 12 a las 21:05

Te faltarán los números de depósito que no existen en la tabla. - Taryn

cámbielo a contar (cubo) por ejemplo - víctor

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.