之前可能会提出类似的问题,但我找不到它们。所以这是我的目标。
我有三个表,如1.Bill 2.BillDetail 3.ExpenseInfo
。表“Bill”有一个名为“BillID
”的主键,它是表“BillDetail”的外键。类似地,表“ExpenseInfo”具有PK“ExpenseID
”,其也是FK到“BillDetail”。这些表中保存的数据采用以下格式。 For 1 entry in Bill table, there might be 1 or more rows in BillDetail table where each row contains 1 ExpenseID
。现在我想写一个查询,它将选择像 -
BillID BillDate Fuel Food Travel
1 28-02-12 10 20 50
这里Fuel,Food,Travel是保存在表格“ExpenseInfo”中的各种费用类型。我试过下面的。我是以正确的方式还是采用其他一些聪明的方式来做到这一点?
SELECT *
FROM t_BillInfoDetail a
LEFT OUTER JOIN
(
SELECT ISNULL(ExpenseID,0) AS ExpenseID, ISNULL(ExpenseName,'N/A') AS ExpenseName
FROM t_expenseinfo
WHERE ExpenseID=1
) AS LocalTravel ON a.ExpenseID = LocalTravel.ExpenseID
新增 谢谢大家的回复。 目前我的目的是为了我的目的。希望你喜欢它。
SELECT
BI.* , BID.ExpenseID, BID.BillDescription, BID.LocalTravel, BID.LocalHotel, BID.Fuel
FROM
(
SELECT *
FROM t_BillInfo
WHERE BillID = 1
) AS BI
LEFT OUTER JOIN
(
SELECT BillID, BillDescription, ExpenseID,
ISNULL(SUM(CASE ExpenseID WHEN 1 THEN Amount ELSE 0 END), 0) AS LocalTravel,
ISNULL(SUM(CASE ExpenseID WHEN 2 THEN Amount ELSE 0 END), 0) AS LocalHotel,
ISNULL(SUM(CASE ExpenseID WHEN 3 THEN Amount ELSE 0 END), 0) AS Fuel
FROM t_BillInfoDetail
GROUP BY BillID, BillDescription, ExpenseID
) AS BID ON BI.BillID = BID.BillID
答案 0 :(得分:1)
可能我没有正确地提出这个问题,但正如我所看到的,你有3个表加入,就像“链”Bill -HAS_MANY> BillDetail -HAS_ONE> ExpenseInfo
一样。
如果是这种情况,您只需要连接具有内部联接的表,请求来自您需要的每个表的数据。您没有提供表格结构,但应该这样做:
select b.aBillField, bd.aBillDetailField, ei.aExpenseInfoField from bill b
inner join billDetail bd
on b.billID = bd.billFK
inner join expenseInfo ei
on ei.expenseFK = bd.billDetailId
where expenseId = 1
当然,用相应的字段替换发明的字段。
答案 1 :(得分:0)
如果您需要商店程序,并且如果您在问题中可以更清楚,我们可以轻松回答您...现在您尝试这个
create procedure [dbo].[SP_GetInfo]
(
@ExpenseID int
)
as
begin
select Bill .BillID , BillDetail .BillDate , ExpenseInfo.Fuel
from Bill , BillDetail , ExpenseInfo
where Bill .BillID = BillDetail .BillID
AND ExpenseInfo.ExpenseID =@ExpenseID
GO
试试这个,如果你有任何错误请问我....
答案 2 :(得分:0)
如果我读得正确,您希望在ExpenseInfo表中PIVOT
数据。请尝试以下方法:
SELECT BillID,
BillDate,
Fuel,
Food,
Travel
FROM (SELECT BillID,
BillDate,
ExpenseName,
ExpenseAmount
FROM Bill AS B
INNER JOIN BillDetail BD
ON B.BillID = BD.BillID
INNER JOIN ExpenseInfo EI
ON BD.ExpenseID = EI.ExpenseID) AS up PIVOT (SUM( ExpenseAmount
) FOR
ExpenseName IN (Fuel, Food, Travel)) AS pvt
ORDER BY BillID
答案 3 :(得分:0)
这就是我正在使用的。它符合我的要求。
SELECT
BI.* , BID.ExpenseID, BID.BillDescription, BID.LocalTravel, BID.LocalHotel, BID.Fuel
FROM
(
SELECT *
FROM t_BillInfo
WHERE BillID = 1
) AS BI
LEFT OUTER JOIN
(
SELECT BillID, BillDescription, ExpenseID,
ISNULL(SUM(CASE ExpenseID WHEN 1 THEN Amount ELSE 0 END), 0) AS LocalTravel,
ISNULL(SUM(CASE ExpenseID WHEN 2 THEN Amount ELSE 0 END), 0) AS LocalHotel,
ISNULL(SUM(CASE ExpenseID WHEN 3 THEN Amount ELSE 0 END), 0) AS Fuel
FROM t_BillInfoDetail
GROUP BY BillID, BillDescription, ExpenseID
) AS BID ON BI.BillID = BID.BillID