我有这张桌子
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子句中。
思想?
答案 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