2015-04-14 63 views
0

我有這個表分區OVER場另一場

ID UPC Sales Date  
1 333 10  1/1/2015 
1 222 20  1/1/2015 
1 111 30  1/1/2015 
1 444 10  2/1/2015 
1 555 20  2/1/2015 
2 333 20  1/1/2015 
2 222 50  1/1/2015 
2 111 30  1/1/2015 
2 444 20  2/1/2015 
2 555 20  2/1/2015 

而且希望這個輸出

我已經試過這

SELECT ID, AVG(Sales) OVER (Partition BY Date) as basket_size 
FROM Transactions 
GROUP BY ID 

但我得到這個錯誤分組時:

Column 'Transactions.Date' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

想法?

回答

0

下面會給你想要的結果:

DECLARE @t TABLE(ID INT,UPC INT, Sales INT, [Date] DATE); 
INSERT INTO @t(ID,UPC,Sales,[Date]) 
VALUES(1,333,10,'2015-01-01'), 
(1,222,20,'2015-01-01'), 
(1,111,30,'2015-01-01'), 
(1,444,10,'2015-01-02'), 
(1,555,20,'2015-01-02'), 
(2,333,20,'2015-01-01'), 
(2,222,50,'2015-01-01'), 
(2,111,30,'2015-01-01'), 
(2,444,20,'2015-01-02'), 
(2,555,20,'2015-01-02'); 

SELECT 
    t1.ID, 
    t1.[SUM(Sales)], 
    t2.basket_size AS [AVG(Sales)], 
    t1.[COUNT(DISTINCT Date)] 
FROM 
    (
     SELECT 
      ID, 
      SUM(Sales) AS [SUM(Sales)], 
      COUNT(DISTINCT [Date]) AS [COUNT(DISTINCT Date)] 
     FROM 
      @t 
     GROUP BY 
      ID 
    ) AS t1 
    INNER JOIN(
     SELECT 
      ID, 
      AVG([SUM(Sales)]) AS basket_size 
     FROM 
      (
       SELECT 
        ID, 
        [Date], 
        SUM(Sales) AS [SUM(Sales)] 
       FROM 
        @t 
       GROUP BY 
        ID, 
        [Date] 
      ) AS tt 
     GROUP BY  
      ID 
    ) AS t2 ON 
     t1.ID=t2.ID 
+0

這工作。謝謝TT – user2502836

+0

@ user2502836思考了一會兒,我想出了一個更簡單的查詢:):SELECT ID,SUM(Sales)AS sum,SUM(Sales)/ COUNT(DISTINCT [Date])AS [avg] ,COUNT(DISTINCT [Date])AS [count] FROM @t GROUP BY ID;'。我相信這對你的要求也是正確的,只是簡單得多。 –

0

這可以通過使用OUTER APPLY完成。試試這個,

CREATE TABLE Transactions(ID INT, UPC INT, Sales INT, [Date] Date) 

INSERT INTO Transactions(ID, UPC, Sales, [Date]) 
VALUES 
(1, 333, 10,  '1/1/2015'), 
(1, 222, 20,  '1/1/2015'), 
(1, 111, 30,  '1/1/2015'), 
(1, 444, 10,  '2/1/2015'), 
(1, 555, 20,  '2/1/2015'), 
(2, 333, 20,  '1/1/2015'), 
(2, 222, 50,  '1/1/2015'), 
(2, 111, 30,  '1/1/2015'), 
(2, 444, 20,  '2/1/2015'), 
(2, 555, 20,  '2/1/2015') 

SELECT ID, SalesSum AS [Sum], SalesSum/[COUNT] AS AVG, [COUNT] AS [Count] FROM (
SELECT ID, Sum(Sales) OVER (PARTITION BY ID) AS SalesSum, [COUNT], 
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) RN 
FROM Transactions 
OUTER APPLY 
(
    SELECT COUNT(DISTINCT [Date]) [COUNT] FROM Transactions 
) AS OUTR 
) TMP WHERE RN = 1 

Sql Fiddle Demo