如何使用sql查询水平选择详细信息表中的垂直数据?

时间:2012-02-28 05:34:27

标签: c# asp.net sql

之前可能会提出类似的问题,但我找不到它们。所以这是我的目标。 我有三个表,如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 

4 个答案:

答案 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