Sql server 对SQL中的列求和

Sql server 对SQL中的列求和,sql-server,tsql,Sql Server,Tsql,我的数据库中有四个表,它们是星型模式设计的。那些桌子是 产品标识、产品名称 店铺DM分支机构Id、分支机构名称、分支机构状态 日期\u DM Date \u Id为日期、天、月和年。日期、月份和年份值是基于日期Id填充的。 收入、产品id、分支机构id、日期id、数量 我想拥有的是,我想看看过去五年节礼日销售最多产品的5家分店或商店 SELECT RF.BRANCH_ID, SD.BRANCH_NAME, SD.BRANCH_STATE, PD.PRODUCT_

我的数据库中有四个表,它们是星型模式设计的。那些桌子是

产品标识、产品名称 店铺DM分支机构Id、分支机构名称、分支机构状态 日期\u DM Date \u Id为日期、天、月和年。日期、月份和年份值是基于日期Id填充的。 收入、产品id、分支机构id、日期id、数量 我想拥有的是,我想看看过去五年节礼日销售最多产品的5家分店或商店

SELECT 
    RF.BRANCH_ID,
    SD.BRANCH_NAME,
    SD.BRANCH_STATE,
    PD.PRODUCT_NAME,
    SELF_RF.TOTAL,
    FORMAT ( DD.[date], 'd', 'en-US' ) AS 'Great Britain English Result'
FROM 
    PRODUCT_DM  AS PD,
    SHOP_DM     AS SD,
    DATE_DM     AS DD,
    REVENUE_FT  AS RF
JOIN 
    (SELECT BRANCH_ID, [date], SUM(quantity) AS TOTAL
     FROM REVENUE_FT
     GROUP BY BRANCH_ID, [date]) AS SELF_RF ON SELF_RF.BRANCH_ID = RF.BRANCH_ID 
                                            AND SELF_RF.[date] = RF.[date]
WHERE   
    RF.BRANCH_ID = SD.BRANCH_ID  
    AND SD.BRANCH_STATE = 'NSW'         
    AND RF.[date] = DD.[date]     
    AND DD.[day] = 26            
    AND DD.[month] = 12            
    AND DD.[year] BETWEEN 2012 AND 2018
ORDER BY 
    SELF_RF.TOTAL DESC;
这是我的查询结果:


问题在于它没有总结不同的产品和不同的日期,例如2013年12月26日和2014年12月26日也应该总结。我知道我的查询有问题,但我需要帮助。

请参见下面的示例,在该示例中,您可以找到过去5个节礼日内销售额最高的前5家分店/商店

这是一个基于上面列出的表结构的示例

;with GetBranchDetailsAndData
as
(
    --Joins the date table, sales, and shop details to get the branch details and quantity per transaction
    SELECT 
        c.Branch_Id,
        c.Branch_Name,
        c.Branch_State,
        a.Quantity
    FROM 
        Revenue_FT a
    INNER JOIN 
        DATE_DM  b
    ON 
        a.Date_Id = b.Date_Id
    INNER JOIN 
        Shop_DM c
    ON 
        c.Branch_Id = a.Branch_Id
    WHERE 
        [DAY] = 26 AND 
        [Month] = 12
        AND [Year] BETWEEN 2012 AND 2017 --Boxing days in 2012 - 2017
        --You could also filter on a specific state in the where clause

),
SUMDetailsAndData
as
(
    SELECT
        Branch_ID,
        Branch_Name,
        Branch_State, 
        SUM(Quantity) as [Quantity] --Sum quantity per branch
    FROM 
        GetBranchDetailsAndData
    GROUP BY
        Branch_ID,
        Branch_Name,
        Branch_State
), 
GetTop5
as
(
    SELECT
        Branch_ID,
        Branch_Name,
        Branch_State,
        Quantity,
        DENSE_RANK() OVER(ORDER BY Quantity DESC) as [QuantityOrder] --DENSE RANK to get the quantity order 
    FROM 
        SUMDetailsAndData
)
SELECT
    *
FROM
    GetTop5
WHERE 
    QuantityOrder <= 5 --Where the quantity order less or equal to 5. This will return multiple rows if there is multiple with the same number in the top 5. 
ORDER BY 
    QuantityOrder
下面是我用来生成测试数据的一个片段

--Create tables
CREATE TABLE Product_DM (Product_Id bigint identity(1,1), Product_Name NVARCHAR(200))
CREATE TABLE Shop_DM (Branch_Id bigint identity(1,1), Branch_Name NVARCHAR(100), Branch_State NVARCHAR(100))
CREATE TABLE Date_DM (Date_Id bigint identity(1,1), [Day] int, [Month] int, [Year] int)
CREATE TABLE Revenue_FT (Product_id bigint, Branch_Id bigint, Date_Id bigint, Quantity bigint)
--Insert Data
INSERT INTO Product_DM (Product_Name) VALUES ('Test Product'),('Test Product2')
INSERT INTO Shop_DM (Branch_Name, Branch_State) VALUES 
('Branch1', 'State1'), ('Branch2', 'State1'), ('Branch3', 'State1'), ('Branch4', 'State1'), ('Branch5', 'State1'), 
('Branch6', 'State1'), ('Branch7', 'State1'), ('Branch8', 'State1'), ('Branch9', 'State1'), ('Branch10', 'State1')

DECLARE @DateStart date = '2010-01-01', @DateEnd date = '2018-01-01'
WHILE(@DateStart <= @DateEnd) 
BEGIN
    INSERT INTO DATE_DM ([day], [month], [year]) VALUES (DATEPART(dd, @datestart), DATEPART(MM, @datestart), DATEPART(YYYY, @datestart))
    SET @DateStart = DATEADD(dd, 1, @DateStart)
END

--Insert random product sales
DECLARE @MinProduct int = 1, @MaxProduct int = 2
DECLARE @MinBranch int = 1, @MaxBranch int = 10
DECLARE @MinDate int = 1, @MaxDate int = 2923
DECLARE @Startloop int = 1, @EndLoop int = 200000

WHILE @Startloop <= @EndLoop
BEGIN
    INSERT INTO Revenue_FT VALUES (
            ROUND(((@MaxProduct - @MinProduct) * RAND() + @MinProduct), 0), 
            ROUND(((@MaxBranch - @MinBranch) * RAND() + @MinBranch), 0), 
            ROUND(((@MaxDate - @MinDate) * RAND() + @MinDate), 0), 1)

    SET @Startloop = @Startloop + 1
END
输出示例如下:


您的查询中有PRODUCT_DM,但它未联接到任何表。因此,你实际上是在做一个交叉连接,5个销售大多数产品的分店或商店到底意味着什么?大多数产品是以销售总量还是产品总数来衡量的?另外,请避免这种类型的连接,请使用ANSI类型的表join@Squirrel对不起,我有点困惑。对5 Branch表示您可以看到Branch_Id,大多数产品表示总量。在图中,它有4个分支id 1。如果它总结起来的话,这个分支机构将有400个。这就像一个魅力。非常感谢您为回答和解释问题所做的努力。多谢各位