Как я могу выбрать вертикальные данные из таблицы сведений по горизонтали, используя SQL-запрос? - PullRequest
1 голос
/ 28 февраля 2012

возможно, что подобные вопросы задавались ранее, но я не могу их найти.Так вот моя цель.У меня есть три таблицы, такие как 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

здесь Топливо, питание, поездки - это различные типы расходов, сохраненные в таблице «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 ]

1 голос
/ 28 февраля 2012

Возможно, я не правильно понял вопрос, но, как я понимаю, у вас есть 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

Конечно, замените изобретенные поля на соответствующие.

0 голосов
/ 29 февраля 2012

Это то, что я использую.Это соответствует моему требованию.

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 голосов
/ 28 февраля 2012

Если я правильно прочитал, вы хотите PIVOT ваши данные в таблице ExpenseInfo. Попробуйте следующее:

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
0 голосов
/ 28 февраля 2012

В случае, если вам нужна процедура хранения, и если вы можете быть более ясными в вашем вопросе, мы можем легко ответить вам ... сейчас вы попробуйте это

  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

попробуйте это, если у вас есть какие-либоошибка, пожалуйста, спросите меня ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...