我有這個名為 productPrices 的 Sql Server 資料庫表:
shopId int
price decimal(18, 2)
dateFound datetime
我想制作一個格式化為在 chart.js 折線圖上使用的 sql 查詢。折線圖采用以下引數:
一組 X 值 - 在這種情況下將是日期/日期(從最低到最高) 每個 shopId 包含一個價格陣列。
我已經制作了如何在折線圖中顯示資料的 codepen 版本(僅使用手動添加的資料)
https://codepen.io/nickbuus/pen/OJxEGqK
問題是,如果在特定日期沒有為商店添加價格,那么仍然需要存在例如 0 的資料值,因為價格陣列的長度必須與 X 值陣列匹配。
當特定 shopId 在該特定日期沒有值時,我如何進行填寫 0 的查詢?
當它應該用于chart.js折線圖使用的結構時,格式化從sql查詢回傳的資料的最佳方法是什么?
uj5u.com熱心網友回復:
理想情況下,您應該在這里做的是創建一個日歷表。我不會在這里介紹如何創建日歷表,因為在您最喜歡的搜索引擎中搜索“Calendar Table SQL Server”之類的內容將為您提供大量資源,并提供一些很好的解釋及其用例。
一旦你有一張Calendar桌子,你需要把CROSS JOIN它放到你的Shops桌子上;我也假設你有。然后你可以簡單地LEFT JOIN到你的Prices桌子上。
因此,引數化查詢可能如下所示:
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;
如果由于某種原因你不能創建一個日歷表并且你沒有(也不能創建)一個 Shop 表(我強烈建議你創建一個),那么你需要使用一個行內計數創建您的日歷并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;
db<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/404969.html
標籤:
