Sql 服务器查询 returns 每个商店在每个日期的价格,如果特定日期的 shopId 没有数据,则添加 0
Sql Server query that returns prices from each shop on each date and adds a 0 if no data is present for the shopId on a particular date
我有一个名为 productPrices 的 Sql 服务器数据库 table:
shopId int
price decimal(18, 2)
dateFound datetime
我想制作一个 sql 查询格式,以便在 chart.js 折线图上使用。折线图采用以下参数:
X 值数组 - 在此上下文中将是 date/day(从最低到最高)
每个 shopId 包含一个价格数组。
我已经制作了一个关于数据应该如何显示在折线图中的 codepen 版本(仅使用手动添加的数据)
https://codepen.io/nickbuus/pen/OJxEGqK
问题是,如果在特定日期没有为商店添加价格,则仍然需要存在数据值(例如 0),因为价格数组长度必须与 X 值数组相匹配。
当特定 shopId 在该特定日期没有值时,我如何进行填写 0 的查询?
当 sql 查询返回的数据应该用于 chart.js 折线图使用的结构时,格式化返回数据的最佳方式是什么?
理想情况下,您在这里应该做的是创建一个日历 Table。我不会在这里介绍如何创建日历 table,因为在您最喜欢的搜索引擎中搜索诸如“日历 Table SQL 服务器”之类的内容会给您带来巨大的财富资源并给出一些很好的解释及其用例。
一旦你有了 Calendar
table,你需要 CROSS JOIN
将它添加到你的 Shops
table;我也假设你有。然后你可以简单地 LEFT JOIN
到你的 Prices
table.
因此参数化查询可能如下所示:
SELECT S.ShopID,
COUNT(P.Price) AS Prices,
C.CalendarDate AS Datefound
FROM dbo.Calendar C
CROSS JOIN dbo.Shops S
LEFT JOIN dbo.Prices P ON C.CalendarDate = P.DateFound --Though DateFound is a datetime, I assume it's time portion is 00:00:00.000
AND S.ShopId = P.ShopID
WHERE C.CalendarDate >= @StartDate
AND C.CalendarDate < DATEADD(DAY, 1, @EndDate)
GROUP BY S.ShopID,
C.CalendarDate;
如果您出于某种原因无法创建日历 table,并且您没有(也无法创建)商店 table(我强烈建议您创建一个)然后你需要使用内联计数来创建你的日历,并且 DISTINCT
来获取商店 ID。
参数化查询看起来像这样:
WITH N AS(
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
SELECT 0 AS I
UNION ALL
SELECT TOP(DATEDIFF(DAY, @StartDate, @EndDate))
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1, N N2, N N3), --1,000 rows. Add more cross joins for more rows
Calendar AS(
SELECT DATEADD(DAY, T.I, @StartDate) AS CalendarDate
FROM Tally T),
Shops AS(
SELECT DISTINCT P.ShopID
FROM dbo.Prices P)
SELECT S.ShopID,
COUNT(P.Price) AS Prices,
C.CalendarDate AS Datefound
FROM dbo.Calendar C
CROSS JOIN dbo.Shops S
LEFT JOIN dbo.Prices P ON C.CalendarDate = P.DateFound --Though DateFound is a datetime, I assume it's time portion is 00:00:00.000
AND S.ShopId = P.ShopID
GROUP BY S.ShopID,
C.CalendarDate;
我有一个名为 productPrices 的 Sql 服务器数据库 table:
shopId int
price decimal(18, 2)
dateFound datetime
我想制作一个 sql 查询格式,以便在 chart.js 折线图上使用。折线图采用以下参数:
X 值数组 - 在此上下文中将是 date/day(从最低到最高) 每个 shopId 包含一个价格数组。
我已经制作了一个关于数据应该如何显示在折线图中的 codepen 版本(仅使用手动添加的数据)
https://codepen.io/nickbuus/pen/OJxEGqK
问题是,如果在特定日期没有为商店添加价格,则仍然需要存在数据值(例如 0),因为价格数组长度必须与 X 值数组相匹配。
当特定 shopId 在该特定日期没有值时,我如何进行填写 0 的查询?
当 sql 查询返回的数据应该用于 chart.js 折线图使用的结构时,格式化返回数据的最佳方式是什么?
理想情况下,您在这里应该做的是创建一个日历 Table。我不会在这里介绍如何创建日历 table,因为在您最喜欢的搜索引擎中搜索诸如“日历 Table SQL 服务器”之类的内容会给您带来巨大的财富资源并给出一些很好的解释及其用例。
一旦你有了 Calendar
table,你需要 CROSS JOIN
将它添加到你的 Shops
table;我也假设你有。然后你可以简单地 LEFT JOIN
到你的 Prices
table.
因此参数化查询可能如下所示:
SELECT S.ShopID,
COUNT(P.Price) AS Prices,
C.CalendarDate AS Datefound
FROM dbo.Calendar C
CROSS JOIN dbo.Shops S
LEFT JOIN dbo.Prices P ON C.CalendarDate = P.DateFound --Though DateFound is a datetime, I assume it's time portion is 00:00:00.000
AND S.ShopId = P.ShopID
WHERE C.CalendarDate >= @StartDate
AND C.CalendarDate < DATEADD(DAY, 1, @EndDate)
GROUP BY S.ShopID,
C.CalendarDate;
如果您出于某种原因无法创建日历 table,并且您没有(也无法创建)商店 table(我强烈建议您创建一个)然后你需要使用内联计数来创建你的日历,并且 DISTINCT
来获取商店 ID。
参数化查询看起来像这样:
WITH N AS(
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
SELECT 0 AS I
UNION ALL
SELECT TOP(DATEDIFF(DAY, @StartDate, @EndDate))
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1, N N2, N N3), --1,000 rows. Add more cross joins for more rows
Calendar AS(
SELECT DATEADD(DAY, T.I, @StartDate) AS CalendarDate
FROM Tally T),
Shops AS(
SELECT DISTINCT P.ShopID
FROM dbo.Prices P)
SELECT S.ShopID,
COUNT(P.Price) AS Prices,
C.CalendarDate AS Datefound
FROM dbo.Calendar C
CROSS JOIN dbo.Shops S
LEFT JOIN dbo.Prices P ON C.CalendarDate = P.DateFound --Though DateFound is a datetime, I assume it's time portion is 00:00:00.000
AND S.ShopId = P.ShopID
GROUP BY S.ShopID,
C.CalendarDate;