我正在使用 SQL Server 2016。
這是我的查詢的一部分(唯一重要的部分),洗掉了一些不必要的列:
SELECT DISTINCT
S.Status,
DT.scheduledstartdate
DT.actualstartdate
DT.scheduledenddate
MAX(CASE DD.Detail WHEN 'Note' THEN DD.Value END) Notes,
MAX(CASE DD.Detail WHEN 'Late' THEN DD.[Value] END) Reason,
FROM
dbo.View_RptMod S
JOIN
[dbo].[View_Phase] P ON P.Studyd = S.Studyd
JOIN
[dbo].[View_Prop] VP ON VP.[Studyd] = S.Studyd
JOIN
(SELECT
[RowId], [actualstartdate], [scheduledstartdate],[scheduledenddate], [comments]
FROM
[dbo].[DataInfo] DT
JOIN
(SELECT [RowId], [Detail], [Value]
FROM dbo.DataDetail) DD ON DD.RowId = DT.RowId
WHERE
[scheduledstartdate] IS NOT NULL) DT ON DT.PhaseRowId = P.phaserowid
正如你所看到的,我做了很多連接。如果我洗掉
MAX(CASE DD.Detail WHEN 'Note' THEN DD.Value END) Notes,
MAX(CASE DD.Detail WHEN 'Reason' THEN DD.Value END) Reasons,
從我的查詢的頂部選擇整個查詢中的所有變數,它運行沒有問題,但我錯過了我需要的兩列。我收到一個錯誤:
無法系結多部分識別符號“DD.Detail”/“DD.Value”
當我用MAX(CASE...)陳述句運行它時。我試過在沒有“DD”的情況下運行它。(僅詳細資訊/值)但會彈出相同的錯誤訊息。
這兩個MAX(CASE...)陳述句幾乎完成了資料透視的作用,我從一列獲取資訊并根據這些值“創建”另一列。
I have already googled this error message and am wondering if maybe I just don't understand but, how do I properly call a column from a join that is inside another join statement, so that when I run the query, that column appears in the output?
Without MAX(CASE....) my output looks like this:
| Status | scheduledstartdate | actualstartdate |
|---|---|---|
| Closed | 2019-01-01 | 2021-01-01 |
| Open | 2021-10-31 | 2021-09-10 |
What I would like my output to look like (with MAX(CASE...) or similar) is like this:
| Status | scheduledstartdate | actualstartdate | Notes | Reasons |
|---|---|---|---|---|
| Closed | 2019-01-01 | 2021-01-01 | Another Note | second reason |
| Open | 2021-10-31 | 2021-09-10 | third note | third reason |
Seen people with this error message on here but I haven't found one that ends up being similar to what I am doing, unless again, I am just not understanding this properly. Have seen some say schema [dbo] might be wrong but if I remove this, I still get the error message.
uj5u.com熱心網友回復:
您需要通過行內表公開Detail和Value列DT。像下面這樣的事情應該做。
SELECT DISTINCT
S.Status,
DT.scheduledstartdate
DT.actualstartdate
DT.scheduledenddate
MAX(CASE DT.Detail WHEN 'Note' THEN DT.Value END) Notes,
MAX(CASE DT.Detail WHEN 'Late' THEN DT.[Value] END) Reason,
FROM dbo.View_RptMod S
JOIN [dbo].[View_Phase] P ON P.Studyd = S.Studyd
JOIN [dbo].[View_Prop] VP ON VP.[Studyd] = S.Studyd
JOIN
(SELECT [RowId],[actualstartdate],[scheduledstartdate],[scheduledenddate],[comments], DD.Value, DD.Detail
FROM [dbo].[DataInfo] DT
JOIN (SELECT [RowId],[Detail],[Value] FROM dbo.DataDetail) DD ON DD.RowId = DT.RowId
WHERE [scheduledstartdate] IS NOT NULL) DT
ON DT.PhaseRowId = P.phaserowid
uj5u.com熱心網友回復:
您的查詢中有許多語法錯誤:
- 導致該錯誤的一個
DD是在派生表中,因此對外部范圍不可見 - 無論如何都沒有必要將這些連接放在派生表中
- 缺少和額外的逗號
DISTINCT但不GROUP BY,您必須GROUP BY為所有非聚合列設定一個。一般來說,DISTINCT對于大多數作業來說是錯誤的工具,它的存在是一種代碼異味
SELECT
S.Status,
DT.scheduledstartdate
DT.actualstartdate
DT.scheduledenddate
MAX(CASE DD.Detail WHEN 'Note' THEN DD.Value END) Notes,
MAX(CASE DD.Detail WHEN 'Late' THEN DD.[Value] END) Reason,
FROM
dbo.View_RptMod S
JOIN
[dbo].[View_Phase] P ON P.Studyd = S.Studyd
JOIN
[dbo].[View_Prop] VP ON VP.[Studyd] = S.Studyd
JOIN
[dbo].[DataInfo] DT ON DT.PhaseRowId = P.phaserowid
JOIN
dbo.DataDetail DD ON DD.RowId = DT.RowId
AND DT.[scheduledstartdate] IS NOT NULL
GROUP BY
S.Status,
DT.scheduledstartdate
DT.actualstartdate
DT.scheduledenddate;
您可能還需要在GROUP BY子句中添加主鍵
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/359854.html
標籤:sql sql-server tsql
上一篇:獲取匹配資料,否則為標準資料
