Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按另一个字段分组时按字段划分_Sql_Sql Server 2008 - Fatal编程技术网

Sql 按另一个字段分组时按字段划分

Sql 按另一个字段分组时按字段划分,sql,sql-server-2008,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/

我有这张桌子

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子句中


想法?

以下内容将为您提供所需的结果:

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

这可以使用
外部应用
完成。试试这个

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

@user2502836思考了一会儿,我想出了一个更简单的查询:):
从@t GROUP BY ID中选择ID,SUM(Sales)作为[SUM],SUM(Sales)/COUNT(DISTINCT[Date])作为[avg],COUNT(DISTINCT[Date])作为[COUNT。我相信这也符合您的要求,只是简单得多。