2011-04-19 12 views
5

Tengo un informe que muestra los productos que los clientes han solicitado, junto con sus precios:Insertar línea en un resultado de la consulta (suma)

CompanyA Product 7 14.99 
CompanyA Product 3 45.95 
CompanyA Product 4 12.00 
CompanyB Product 3 45.95 
CompanyC Product 7 14.99 
CompanyC Product 3 45.95 

me gustaría insertar una línea que resume el fin de cada empresa, de esta manera:

CompanyA Product 7 14.99 
CompanyA Product 3 45.95 
CompanyA Product 4 12.00 
       Total: 72.94 
CompanyB Product 3 45.95 
       Total: 45.95 
CompanyC Product 7 14.99 
CompanyC Product 3 45.95 
       Total: 60.94 

Aquí hay algo de código que muestra la estructura básica de la consulta que tengo:

SELECT company 
    , product 
    , price 
FROM companyMaster 
ORDER BY company, 
    , product, 
    , price; 

¿Alguien sabe cómo hacer esto? Estoy escribiendo esto en Transact-SQL (Microsoft SQL Server).

Respuesta

3

Gracias por los comentarios de todos/ayuda, al menos me hizo pensar en diferentes enfoques. Se me ocurrió algo que no depende de qué versión de SQL Server estoy usando (nuestro proveedor cambia las versiones a menudo, así que tengo que ser lo más compatible posible).

esto podría ser considerado un hack (bueno, es un hack) pero funciona, y se hace el trabajo:

SELECT company 
    , product 
    , price 
FROM companyMaster 
ORDER BY company, 
    , product, 
    , price 

UNION 

SELECT company + 'Total' 
    , '' 
    , SUM(price) 
FROM companyMaster 
GROUP BY company 

ORDER BY company; 

Esta solución utiliza básicamente la unión de dos sentencias de selección. El primero es exactamente como el original, el segundo produce la línea de suma que necesitaba. Para ubicar correctamente la línea de suma, hice una concatenación de cadenas en el nombre de la empresa (añadiendo la palabra "Total"), de modo que cuando clasifico alfabéticamente el nombre de la empresa, la fila Total se muestre en la parte inferior de cada sección de la empresa .

Esto es lo que el informe final se parece (no es exactamente lo que quería, pero funcionalmente equivalentes, pero no es muy agradable a la vista:

CompanyA Product 7 14.99 
CompanyA Product 3 45.95 
CompanyA Product 4 12.00 
CompanyA Total   72.94 
CompanyB Product 3 45.95 
CompanyB Total   45.95 
CompanyC Product 7 14.99 
CompanyC Product 3 45.95 
CompanyC Total   60.94 
+0

buen "truco", funciona bien – Jared

4
SELECT company, 
     product, 
     SUM(price) 
FROM companyMaster 
GROUP BY 
     company, ROLLUP(product) 
+0

Cuando intento esto en el Analizador de consultas, estoy recibiendo el siguiente error (solo para aclarar, estoy usando T-SQL): Servidor: Msg 195, nivel 15, estado 10, línea 59 'ROLLUP' no es un nombre de función incorporado reconocido. – dvanaria

+0

Mirando en línea, parece que el COMPUTE la función puede ser compatible con la versión de T-SQL que estoy usando. ROLLUP solo es compatible con el Servidor 2005 y posteriores. – dvanaria

+0

@dvanaria - necesita especificar qué versión está usando, entonces. – JNK

2

Puesto que usted está en SQL Server 2005 es necesario utilizar rollup como este.

-- cte for test data 
;with companyMaster(company, product, price) as 
(select 'CompanyA', 'Product 7', 14.99 union all 
select 'CompanyA', 'Product 3', 45.95 union all 
select 'CompanyA', 'Product 4', 12.00 union all 
select 'CompanyB', 'Product 3', 45.95 union all 
select 'CompanyC', 'Product 7', 14.99 union all 
select 'CompanyC', 'Product 3', 45.95 
) 

select 
    company, 
    case when grouping(product) = 0 
    then product 
    else 'Total:' 
    end, 
    sum(price) 
from companyMaster 
group by company, product with rollup 
having grouping(company) = 0 
Cuestiones relacionadas