希望有人能幫助我在這裏。SQL查詢與多個小計
我試圖在一個SQL查詢小計,而不是作爲另一列。
看到的結果我得到和解釋截圖
這是查詢我到目前爲止
SELECT
ar.Person_Id AS 'Id',
pa.Serial_Number,
ar.Family_Name + ', '+ar.First_Name AS 'Name',
CASE WHEN ar.Line_Type = 'A' THEN 'Activity: '+ar.Item_Name ELSE 'Hotel: '+ar.Item_Name END AS 'Description',
CAST(IsNull(ar.Old_Amount_Excl_VAT,0) AS DECIMAL(10,2)) AS 'Amount Excl VAT',
CAST(IsNull(ar.Old_Amount_Incl_VAT,0) AS DECIMAL(10,2)) AS 'Amount Incl VAT',
CAST(IsNull(ar.Old_Amount_Incl_VAT,0) - IsNull(ar.Old_Amount_Excl_VAT,0) AS DECIMAL(10,2)) AS 'VAT Amount',
p.Currency_Code,
(
SELECT TOP 1 pt.Payment_Type + ' ' + pt.Description AS Payment_Type FROM PaymentsPerPerson ppp
LEFT OUTER JOIN PaymentCodes pc ON ppp.Client_Id = pc.Client_Id AND ppp.Project_Id = pc.Project_Id AND ppp.Payment_Code = pc.Payment_Code
LEFT OUTER JOIN PaymentTypes pt ON ppp.Client_Id = pt.Client_Id AND ppp.Project_Id = pt.Project_Id AND pt.Payment_Type = pc.Payment_Type
WHERE ppp.Client_Id = ar.Client_Id AND ppp.Project_Id = ar.Project_Id AND ppp.Person_Id = ar.Person_Id AND ppp.Line_Number IN (SELECT MAX(Line_Number) FROM PaymentsPerPerson WHERE Person_Id = ar.Person_Id)) AS Payment_Type,
(
SELECT TOP 1 convert(varchar, Payment_Date, 120) AS Payment_Date FROM PaymentsPerPerson WHERE Client_Id = ar.Client_Id AND Project_Id = ar.Project_Id AND Person_Id = ar.Person_Id ORDER BY Line_Number DESC
) AS Payment_Date,
(
SELECT TOP 1 Card_Reference FROM PaymentsPerPerson WHERE Client_Id = ar.Client_Id AND Project_Id = ar.Project_Id AND Person_Id = ar.Person_Id ORDER BY Line_Number DESC
) AS Transaction_Id,
convert(varchar, getdate(), 120) AS Date
FROM
AccountingReport ar
LEFT OUTER JOIN Participants pa ON ar.Client_Id = pa.Client_Id AND ar.Project_Id = pa.Project_Id AND ar.Person_Id = pa.Person_Id AND pa.Date_Registered IS NOT NULL
LEFT OUTER JOIN Projects p ON ar.Client_Id = p.Client_Id AND ar.Project_Id = p.Project_Id
RIGHT OUTER JOIN PaymentsPerPerson ppp ON ar.Client_Id = ppp.Client_Id AND ar.Project_Id = ppp.Project_Id AND ar.Person_Id = ppp.Person_Id
WHERE
ar.Client_Id = 'CLIENTID' AND
ar.Project_Id = 'PROJECTID' AND
(IsNull(Old_Amount_Excl_VAT,0) <> 0
OR IsNull(Old_Amount_Incl_VAT,0) <> 0)
AND pa.Date_Registered IS NOT NULL
ORDER BY
ar.Person_Id,
Item_Id,
SubItem_Id,
SubSubItem_Id
我一直在使用ROLLUP嘗試,但,這是我所得到的
這是我一直在使用匯總
SELECT
CASE WHEN (GROUPING(ar.Person_Id) = 1) THEN 0
ELSE ISNULL(ar.Person_Id, 'UNKNOWN')
END AS 'Id',
CASE WHEN (GROUPING(pa.Serial_Number) = 1) THEN 0
ELSE ISNULL(pa.Serial_Number, 'UNKNOWN')
END AS Serial_Number,
CASE WHEN (GROUPING(ar.Family_Name + ', '+ar.First_Name) = 1) THEN 'ALL'
ELSE ISNULL(ar.Family_Name + ', '+ar.First_Name, 'UNKNOWN')
END AS 'Name',
CASE WHEN ar.Line_Type = 'A' THEN 'Activity: '+ar.Item_Name ELSE 'Hotel: '+ar.Item_Name END AS 'Description',
SUM(CAST(IsNull(ar.Old_Amount_Excl_VAT,0) AS DECIMAL(10,2))) AS 'Amount Excl VAT',
SUM(CAST(IsNull(ar.Old_Amount_Incl_VAT,0) AS DECIMAL(10,2))) AS 'Amount Incl VAT',
SUM(CAST(IsNull(ar.Old_Amount_Incl_VAT,0) - IsNull(ar.Old_Amount_Excl_VAT,0) AS DECIMAL(10,2))) AS 'VAT Amount',
CASE WHEN (GROUPING(p.Currency_Code) = 1) THEN 'ALL'
ELSE ISNULL(p.Currency_Code, 'UNKNOWN')
END AS Currency_Code,
(
SELECT TOP 1 pt.Payment_Type + ' ' + pt.Description AS Payment_Type FROM PaymentsPerPerson ppp
LEFT OUTER JOIN PaymentCodes pc ON ppp.Client_Id = pc.Client_Id AND ppp.Project_Id = pc.Project_Id AND ppp.Payment_Code = pc.Payment_Code
LEFT OUTER JOIN PaymentTypes pt ON ppp.Client_Id = pt.Client_Id AND ppp.Project_Id = pt.Project_Id AND pt.Payment_Type = pc.Payment_Type
WHERE ppp.Client_Id = ar.Client_Id AND ppp.Project_Id = ar.Project_Id AND ppp.Person_Id = ar.Person_Id AND ppp.Line_Number IN (SELECT MAX(Line_Number) FROM PaymentsPerPerson WHERE Person_Id = ar.Person_Id)
) AS Payment_Type,
(
SELECT TOP 1 convert(varchar, Payment_Date, 120) AS Payment_Date FROM PaymentsPerPerson WHERE Client_Id = ar.Client_Id AND Project_Id = ar.Project_Id AND Person_Id = ar.Person_Id ORDER BY Line_Number DESC
) AS Payment_Date,
(
SELECT TOP 1 Card_Reference FROM PaymentsPerPerson WHERE Client_Id = ar.Client_Id AND Project_Id = ar.Project_Id AND Person_Id = ar.Person_Id ORDER BY Line_Number DESC
) AS Transaction_Id,
CONVERT(varchar, GETDATE(), 120) AS Date
FROM
AccountingReport ar
LEFT OUTER JOIN Participants pa ON ar.Client_Id = pa.Client_Id AND ar.Project_Id = pa.Project_Id AND ar.Person_Id = pa.Person_Id AND pa.Date_Registered IS NOT NULL
LEFT OUTER JOIN Projects p ON ar.Client_Id = p.Client_Id AND ar.Project_Id = p.Project_Id
RIGHT OUTER JOIN PaymentsPerPerson ppp ON ar.Client_Id = ppp.Client_Id AND ar.Project_Id = ppp.Project_Id AND ar.Person_Id = ppp.Person_Id
WHERE
ar.Client_Id = 'CLIENTID' AND
ar.Project_Id = 'PROJECTID' AND
(IsNull(Old_Amount_Excl_VAT,0) <> 0
OR IsNull(Old_Amount_Incl_VAT,0) <> 0)
AND pa.Date_Registered IS NOT NULL
GROUP BY
ar.Client_Id,
ar.Project_Id,
ar.Person_Id,
pa.Serial_Number,
ar.Line_Type, ar.Item_Name, ar.Item_Id, ar.SubItem_Id, ar.SubSubItem_Id,
p.Currency_Code,
ar.Family_Name + ', '+ar.First_Name WITH ROLLUP
ORDER BY
ar.Person_Id,
Item_Id,
SubItem_Id,
SubSubItem_Id
任何想法將是巨大的,因爲我不是專家的SQL中使用的查詢。
是否有可能做與SQL Server?或者我需要一些腳本(asp,php)來生成這個?
它會更好,如果它可以用SQL查詢來完成,因爲我們出口的結果是Excel報表當客戶端點擊一個按鈕。
你必須使用sql來解決這個問題嗎?我假設你打算在其他地方使用這個查詢。我認爲一個報告工具可能會做得很好,在Excel中的數據透視表也可以工作,並且數據透視表可以基於sql查詢,因此您可以根據需要進行刷新。 – user3973227 2014-09-05 14:40:43
它必須是SQL,我們使用SQL查詢導出爲excel。這被不少客戶使用,所以越容易越好。 – 2014-09-05 14:42:28