/ / SQL consulta de vendas por cliente ao longo de vários anos para os 50 principais clientes em um ano - sql, sql-server, select, aninhado

Consulta SQL de vendas por cliente durante vários anos para os 50 principais clientes em um ano - sql, sql-server, select, aninhado

Eu tenho uma consulta no servidor SQL que com sucessoretorna os 50 principais clientes de um determinado ano por vendas. Quero expandi-lo para retornar suas vendas pelos anos adicionais em que eles podem ou não estar entre os 50 principais.

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

Tentei adicionar instruções SELECT aninhadas, mas elasretorne resultados estranhos e não sei por que (talvez nem funcione, mas os resultados me deixam pasmo de qualquer maneira). Quando incluídos, os valores de cada linha são alterados e os clientes são duplicados.

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

Eu tentei colocar uma instrução TOP em um SELECT aninhado em HAVING, mas isso me diz

"Mensagem 8114, nível 16, estado 5, linha 1

Erro ao converter o tipo de dados varchar em 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)

Respostas:

0 para resposta № 1

Se bem entendi, você está procurandoas 50 principais vendas para clientes com base nos dados de 2011 - e deseja ver todos os dados dos anos para os 50 principais a partir de 2011, independentemente de esses clientes estarem entre os 50 principais por outros anos.

Tente isso, talvez seja necessário ajustar um pouco, pois eu não conheço o esquema, mas se eu entendi a pergunta corretamente, isso deve funcionar.

    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 resposta № 2

você pode usar algo como abaixo ... estará analisando todos os dados de todos os anos que deseja ver e apenas obtendo os 50 melhores para o ano de 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