Almacenamiento de datos en SQL Server 2008
Frecuentes
Visto 669 equipos
3
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:
¿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
3 Respuestas
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
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
1
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
¿Puedes ayudar con esto? stackoverflow.com/questions/10711220/… - Alex Gordon
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
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
¿Puedes ayudar con esto? stackoverflow.com/questions/10711220/… - Alex Gordon
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas sql sql-server sql-server-2008 or haz tu propia pregunta.
@marc_s ¿puedes ayudarme con esto? stackoverflow.com/questions/10711220/… - Alex Gordon