首先我有一張這樣的表:
| 視頻ID | 出價 | 日期 | 型別 | 價值 |
|---|---|---|---|---|
| 1 | 100 | 22.01.2021 | ○ | 250.00 |
| 1 | 110 | 25.01.2021 | C | 100.00 |
| 2 | 120 | 13.02.2021 | ○ | 400.00 |
| 3 | 130 | 20.02.2021 | ○ | 475.00 |
| 3 | 140 | 11.03.2022 | C | 75.00 |
| 1 | 150 | 15.03.2022 | ○ | 560.00 |
為了顯示每月訂購(o)和收費(c)的值,我必須喜歡在 MSSQL SELECT 查詢中為每個月訂購和收費的“生成”列。這是我想要獲得的示例表:
| 視頻ID | JAN2021O | JAN2021C | FEB2021O | FEB2021C | … | MAR2022O | MAR2022C |
|---|---|---|---|---|---|---|---|
| 1 | 250.00 | 100.00 | 560.00 | ||||
| 2 | 400.00 | ||||||
| 3 | 475.00 | 75.00 |
除了我已經擁有的其他一些列之外,我還需要將其加入 SQL SELECT 中。
有沒有人有想法,可以幫助我嗎?
uj5u.com熱心網友回復:
在查看表中的任何資料之前,SQL 語言有一個非常嚴格的要求,即在查詢編譯時知道結果中的列數和每列的型別。這甚至適用于和查詢,其中列仍然在查詢編譯時通過表定義(而不是資料)或 SQL 陳述句確定。SELECT *PIVOT
因此,如果您想顯示從基準日期算起的特定的已知月數,那么您想要執行的操作只能在單個查詢中進行。在這種情況下,您可以通過指定 SQL 中的每一列并使用帶有條件聚合的日期數學來計算從您的起點開始的每個月份的值來完成此操作。該PIVOT關鍵字可以幫助減少代碼,但你還是手工指定每一列,并且查詢仍然會從小事遠。
如果您沒有具體的、已知的要評估的月數,則必須通過以下幾個步驟來完成:
- 運行查詢以了解您有多少個月。
- 使用步驟 1 的結果動態構造一條新陳述句
- 運行在步驟 2 中構造的陳述句。
沒有其他辦法。
即便如此,與通過 SQL 本身相比,這種型別的資料透視通常在客戶端代碼或報告工具(在表示級別)中處理得更好。
這個特定查詢不太可能出現,但您還應該意識到,這種動態 SQL 可能會引發某些安全問題,因為一些防止注入問題的正常機制不可用(在步驟 2 中構建新查詢時,您無法引數化源列的名稱,這些名稱取決于可能是用戶生成的資料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/338402.html
標籤:sql sql-server 加入
下一篇:MongoDB加入主鍵/外鍵
