/ / Consulta SQL de ventas por cliente durante varios años para los 50 principales clientes en un año: sql, sql-server, select, nested

Consulta SQL de ventas por cliente a lo largo de varios años para los 50 principales clientes en un año: SQL Server, SQL Server, Select, Nested

Tengo una consulta en el servidor SQL que exitosamentedevuelve los 50 principales clientes para un año determinado por ventas. Quiero expandirlo para devolver sus ventas por los años adicionales cuando pueden o no estar entre los primeros 50.

SELECT TOP 50 CU.CustomerName, SUM(ART.SalesAnalysis) AS "2011"
FROM ARTransaction AS ART, Customer AS CU
WHERE ART.CustomerN = CU.CustomerN AND ART.PostingDate BETWEEN "2010-12-31" AND "2012-01-01"
GROUP By CU.CustomerName
ORDER BY SUM(ART.SalesAnalysis) DESC

Intenté agregar sentencias SELECT anidadas perodevuelvo resultados extraños y no estoy seguro de por qué (puede que nunca funcione, pero los resultados me han dejado estupefacto de todos modos). Cuando se incluyen, los valores de cada fila cambian y los clientes se duplican.

(SELECT SUM(ART.SalesAnalysis)
WHERE ART.PostingDate BETWEEN "2011-12-31" AND "2013-01-01") AS "2012"

Traté de poner una declaración TOP en un SELECT anidado en HAVING pero eso me dice

"Mensaje 8114, Nivel 16, Estado 5, Línea 1

Error al convertir el tipo de datos varchar a numérico ".

SELECT CU.CustomerName, SUM(ART.SalesAnalysis) AS "2011"
FROM ARTransaction AS ART
JOIN Customer AS CU ON ART.CustomerN = CU.CustomerN
GROUP BY CU.CustomerNAme
HAVING CU.CustomerNAme IN
(SELECT TOP 50 CU.CustomerName
FROM ARTransaction
JOIN Customer ON ARTransaction.CustomerN = Customer.CustomerN
WHERE ARTransaction.SalesAnalysis BETWEEN "2010-12-31" AND "2012-01-01"
GROUP BY Customer.CustomerN
ORDER BY SUM(ART.SalesAnalysis) DESC)

Respuestas

0 para la respuesta № 1

Si entiendo correctamente, estás buscandolas 50 principales ventas para clientes según los datos de 2011, y queremos ver los datos de todos los años de los 50 principales de 2011, independientemente de que esos clientes se encuentren entre los 50 mejores de otros años.

Intente esto, es posible que deba modificarse un poco ya que no conozco el esquema, pero si entiendo la pregunta correctamente, esto debería ser el truco.

    WITH Top50 AS (
SELECT TOP 50
CU.CustomerN
,SUM(ART.SalesAnalysis) AS SalesTotal
FROM
ARTransaction art
INNER JOIN
Customer cu
ON cu.CustomerN = art.CustomerN
WHERE
ART.PostingDate BETWEEN CAST("2011-01-01" AS DATETIME)
AND CAST("2011-12-31" AS DATETIME)
GROUP BY
CU.CustomerN
ORDER BY
SUM(ART.SalesAnalysis) DESC)

SELECT
c.CustomerName
,SUM(a.SalesAnalysis) AS TotalSales
,YEAR(a.PostingDate) AS PostingDateYear
FROM
ARTransaction a
INNER JOIN
Customer c
ON c.CustomerN = a.CustomerN
INNER JOIN
Top50 t
ON t.CustomerN = a.CustomerN
GROUP BY
c.CustomerName
,YEAR(a.PostingDate)
ORDER BY
PostingDateYear

0 para la respuesta № 2

podría usar algo como a continuación ... verá todos los datos de todos los años que desea ver y luego obtendrá los 50 mejores para el año 2011

SELECT TOP 50
CU.CustomerName,
SUM(case when year(ART.PostingDate) = 2011 -- or you could use case when ART.PostingDate BETWEEN "2011-01-01" AND "2011-12-31"
then ART.SalesAnalysis
else 0 end) AS 2011,
SUM(case when year(ART.PostingDate) = 2012
then ART.SalesAnalysis
else 0 end) AS 2012
FROM
ARTransaction ART,
inner join Customer CU
on ART.CustomerN = CU.CustomerN
WHERE ART.PostingDate BETWEEN "2011-01-01 AND "2012-12-31"
GROUP By CU.CustomerName
ORDER BY
SUM(case when year(ART.PostingDate) = 2011
then ART.SalesAnalysis
else 0 end)  DESC