Sql server 对SQL中的列求和
我的数据库中有四个表,它们是星型模式设计的。那些桌子是 产品标识、产品名称 店铺DM分支机构Id、分支机构名称、分支机构状态 日期\u DM Date \u Id为日期、天、月和年。日期、月份和年份值是基于日期Id填充的。 收入、产品id、分支机构id、日期id、数量 我想拥有的是,我想看看过去五年节礼日销售最多产品的5家分店或商店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_
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个。这就像一个魅力。非常感谢您为回答和解释问题所做的努力。多谢各位