在按另一个字段分组时分区OVER字段

时间:2015-04-14 14:54:54

标签: sql sql-server-2008

我有这张桌子

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

想要这个输出

ID  SUM(Sales)  Avg(Sales)  COUNT(DISTINCT DATE)
1    90           45                2
2    140          70                2

我试过这个

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

但是我收到了这个错误:

  

列'Transactions.Date'在选择列表中无效,因为它是   不包含在聚合函数或GROUP BY子句中。

思想?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

相关问题