2014-03-26 5 views
1

가능한 경우 적은 쿼리를 사용하기 위해이 쿼리를 작성하는 가장 좋은 방법을 알아 내려고 애 쓰고 있습니다. 피벗 테이블이 올바른 방법 일지 궁금합니다.하나의 결과에서 복수의 sql 쿼리

내 3 개 별도의 쿼리 :

SELECT 
ISNULL(SUM(ps.UnitsSold), 0) AS UnitsSold, 
ISNULL(pg.[Description], 'Other') AS [Description] 
FROM dbo.ProductSales ps 
LEFT OUTER JOIN dbo.Product p ON ps.ProductID = p.ProductID 
LEFT OUTER JOIN dbo.ProductGroupings pg ON p.[Asin] = pg.[Asin] 
WHERE (ps.OrderDate BETWEEN GETDATE() - 10 AND GETDATE() - 3) AND  ps.DistributionCentreID IN (3) 
GROUP BY pg.[Description], ps.DistributionCentreID 

SELECT 
ISNULL(SUM(ps.UnitsSold), 0) AS UnitsSold, 
ISNULL(pg.[Description], 'Other') AS [Description] 
FROM dbo.ProductSales ps 
LEFT OUTER JOIN dbo.Product p ON ps.ProductID = p.ProductID 
LEFT OUTER JOIN dbo.ProductGroupings pg ON p.[Asin] = pg.[Asin] 
WHERE (ps.OrderDate BETWEEN GETDATE() - 17 AND GETDATE() - 10) AND  ps.DistributionCentreID IN (3) 
GROUP BY pg.[Description], ps.DistributionCentreID 

SELECT 
ISNULL(SUM(ps.UnitsSold), 0) AS UnitsSold, 
ISNULL(pg.[Description], 'Other') AS [Description] 
FROM dbo.ProductSales ps 
LEFT OUTER JOIN dbo.Product p ON ps.ProductID = p.ProductID 
LEFT OUTER JOIN dbo.ProductGroupings pg ON p.[Asin] = pg.[Asin] 
WHERE (ps.OrderDate BETWEEN GETDATE() - 374 AND GETDATE() - 367) AND  ps.DistributionCentreID IN (3) 
GROUP BY pg.[Description], ps.DistributionCentreID 

이 생산이 (첫 번째 쿼리)와 유사한 결과 등

UnitsSold Description 

4154  desc1 
764  desc2 

.. 생각하는

것들, 설명 (제품 그룹)은 쿼리 중 하나에 존재하지 않을 수 있으므로이를 고려해야합니다.

가 이상적으로는이 같은 작은 선물보고 싶습니다 ..

Description UnitsSoldThisWeek UnitsSoldLastWeek UnitsSoldLastYear 

Desc1  54    45    37 

질문, 문제 또는 인해 잘못된 질의에 불평하는 것은 허용, 난 행복 해요 SQL에 대한 나의 이해를 향상시킵니다.

감사합니다,

마이클

답변

1

내가 당신의 3 개 쿼리를 결합하는 다른 기술을 보여주기 위해 조금 쿼리를 변경했습니다. 나는 SUMS의 괄호를 아주 바르게 가질 수는 없겠지 만 그것은 당신에게 아이디어를 준다. 노력하고있는 "데이트 사이의"일종의 일을하는 더 좋은 방법도 있지만 그게 문제가 아니 었습니다! 그

SELECT 
    ISNULL(SUM(ps.UnitsSold), 0) AS UnitsSold, 
    ISNULL(pg.[Description], 'Other') AS [Description] 
    SUM(CASE WHEN (ps.OrderDate BETWEEN GETDATE() - 10 AND GETDATE() - 3) AND ps.DistributionCentreID = 3 THEN 1 ELSE 0 END) AS UnitsSoldThisWeek 
    SUM(CASE WHEN (ps.OrderDate BETWEEN GETDATE() - 17 AND GETDATE() - 10) AND ps.DistributionCentreID = 3 THEN 1 ELSE 0 END) AS UnitsSoldThisWeek 
    SUM(CASE WHEN (ps.OrderDate BETWEEN GETDATE() - 374 AND GETDATE() - 367) AND ps.DistributionCentreID = 3 THEN 1 ELSE 0 END) AS UnitsSoldThisWeek 

FROM dbo.ProductSales ps 
LEFT OUTER JOIN dbo.Product p ON ps.ProductID = p.ProductID 
LEFT OUTER JOIN dbo.ProductGroupings pg ON p.[Asin] = pg.[Asin] 
GROUP BY pg.[Description], ps.DistributionCentreID 
+0

이 같은 진행할 수 있습니다 완벽하게 작동하지만, [설명]과 각 SUM .. 후에 누락 된 쉼표 만있었습니다. 감사합니다! – MichaelEaton

2

하나 개의 쿼리 및 조건 집합으로이 작업을 수행 할 수 있는지 확인 :

SELECT coalesce(pg.[Description], 'Other') AS [Description], 
     sum(case when ps.OrderDate BETWEEN GETDATE() - 10 AND GETDATE() - 3 then UnitsSold 
      end) as ThisWeek 
     sum(case when ps.OrderDate BETWEEN GETDATE() - 17 AND GETDATE() - 10 then UnitsSold 
       else 0 
      end) as LastWeek, 
     sum(case when ps.OrderDate BETWEEN GETDATE() - 374 AND GETDATE() - 367 then UnitsSold 
       else 0 
      end) as LastYear 
FROM dbo.ProductSales ps LEFT OUTER JOIN 
    dbo.Product p 
    ON ps.ProductID = p.ProductID LEFT OUTER JOIN 
    dbo.ProductGroupings pg 
    ON p.[Asin] = pg.[Asin] 
WHERE ps.DistributionCentreID IN (3) 
GROUP BY pg.[Description], ps.DistributionCentreID 
+0

이 문제에 대해 고마워, 작동하지만 여러 줄을 받고있어 그룹화 일종의 잃을 것 같다 .. 감사합니다! – MichaelEaton

1
;WITH CTE AS (
Select [UnitsSoldThisWeek],[UnitsSoldLastWeek],[UnitsSoldLastYear] FROM (
SELECT 
ISNULL(SUM(ps.UnitsSold), 0) AS UnitsSold, 
ISNULL(pg.[Description], 'Other') AS [Description] 
FROM dbo.ProductSales ps 
LEFT OUTER JOIN dbo.Product p ON ps.ProductID = p.ProductID 
LEFT OUTER JOIN dbo.ProductGroupings pg ON p.[Asin] = pg.[Asin] 
WHERE (ps.OrderDate BETWEEN GETDATE() - 10 AND GETDATE() - 3) AND  ps.DistributionCentreID IN (3) 
GROUP BY pg.[Description], ps.DistributionCentreID 
UNION ALL 
SELECT 
ISNULL(SUM(ps.UnitsSold), 0) AS UnitsSold, 
ISNULL(pg.[Description], 'Other') AS [Description] 
FROM dbo.ProductSales ps 
LEFT OUTER JOIN dbo.Product p ON ps.ProductID = p.ProductID 
LEFT OUTER JOIN dbo.ProductGroupings pg ON p.[Asin] = pg.[Asin] 
WHERE (ps.OrderDate BETWEEN GETDATE() - 17 AND GETDATE() - 10) AND  ps.DistributionCentreID IN (3) 
GROUP BY pg.[Description], ps.DistributionCentreID 
UNION ALL 
SELECT 
ISNULL(SUM(ps.UnitsSold), 0) AS UnitsSold, 
ISNULL(pg.[Description], 'Other') AS [Description] 
FROM dbo.ProductSales ps 
LEFT OUTER JOIN dbo.Product p ON ps.ProductID = p.ProductID 
LEFT OUTER JOIN dbo.ProductGroupings pg ON p.[Asin] = pg.[Asin] 
WHERE (ps.OrderDate BETWEEN GETDATE() - 374 AND GETDATE() - 367) AND  ps.DistributionCentreID IN (3) 
GROUP BY pg.[Description], ps.DistributionCentreID 
) 
PIVOT(MAX(UnitsSold)FOR Description IN([UnitsSoldThisWeek],[UnitsSoldLastWeek],[UnitsSoldLastYear]))) 
) 
Select [UnitsSoldThisWeek],[UnitsSoldLastWeek],[UnitsSoldLastYear] from CTE 

내가 아주 확실하지 않다 때문에 데이터 부족하지만 우리는이 또한

관련 문제