2012-02-28 8 views
2

의 모든 값을 표시 내가 가지고 룩업 테이블, 기본적으로 신용 카드 종류와테이블을 조인하지만 룩업 테이블

ID | CCType   | 
----------------------- 
1 | AMEX   | 
2 | VISA   | 
3 | MASTER CARD  | 
4 | OTHER   | 

그럼 난 CCTypeID는 찾아 볼의 ID입니다 거래와 다른 테이블이 그런 다음 테이블

TransID | CCTypeID | TransactionName | OrderID | 
----------------------------------------------------- 
1   | 2   | BILLPAY   |10 
2   | 4   | SECUREPAYMENT |13 
3   | 1   | BILLPAY   |15 

마침내 나는 주문과 다른 테이블이

OrderId | OrderDate | Product | TransID | 
    ------------------------------------------------ 
    10  | 2012-02-27 |Grapes  | 1 
    13  | 2012-02-26 |Wine  | 2 
    14  | 2012-01-26 |Pepper  | 6 
    15  | 2012-01-26 |Apple  | 1 

I want to create a view that looks like this 

OrderDate | CCType  | Processed 
----------- --------------------------- 
2012-02-27 | AMEX  | 0 
2012-02-27 | VISA  | 1 
2012-02-27 | MASTER CARD | 0 
2012-02-27 | OTHER  | 0 
2012-02-26 | AMEX  | 0 
2012-02-26 | VISA  | 0 
2012-02-26 | MASTER CARD | 0 
2012-02-26 | OTHER  | 1 

내가 가진 오른쪽 바깥 쪽에서 각각 CCTypeID와 ID에 대한 거래가있는 신용 카드 유형을 조인 한 다음 ORDERID에 주문한 INNER JOIN을 ORDER.DATE와 CardType으로 그룹화했지만 가치가 있다는 것을 보여줄뿐입니다. 날짜에 대한 거래 나 주문이 있더라도 신용 카드 유형을 계속 나열합니다. 그 카드 종류에 대해 제로를 보여 주겠습니까?

정말 감사드립니다.

+2

여기서 처리 된 필드는 어디에서 가져 왔습니까? 당신이 보여준 어떤 테이블에도 나타나지 않습니다. – Taryn

+0

@bluefeet - 그것은 그 날짜와 카드 타입에 대한 레코드 수입니다. – MatBailie

답변

3

기본적인 쿼리

SELECT 
    Orders.OrderDate, 
    CardType.CCType, 
    COUNT(*) 
FROM 
    Orders 
LEFT JOIN 
    Transactions 
    ON Transactions.TransID = Orders.TransID 
    AND Transactions.OrderID = Orders.OrderID 
LEFT JOIN 
    CardType 
    ON CardType.ID = Transaction.CCTypeID 
GROUP BY 
    Orders.OrderDate, 
    CardType.CCType 

당신이 가치를 갖고 "모든 날짜를"필요하면

는, 당신은에 가입 별도의 테이블이 필요합니다 ... 같은 것을해야한다. 예를 들어, calendar이라는 테이블을 만들고 필요한 모든 날짜를 미리 채운 다음 날짜 필드에 인덱스를 만듭니다. 그럼 당신은 옳은 대답의 두 번째 부분으로, 난 정말 여기 만 기존의 대답에 추가하고 당신에 대한 기록을 할 모든 조합 ...

SELECT 
    Calendar.Date, 
    CardType.CCType, 
    COUNT(Transaction.CCTypeID) 
FROM 
    Calendar 
CROSS JOIN 
    CardType 
LEFT JOIN 
    (
    Transactions 
    INNER JOIN 
    Orders 
     ON Transactions.TransID = Orders.TransID 
     AND Transactions.OrderID = Orders.OrderID 
) 
    ON CardType.ID = Transactions.CCTypeID 
    AND Calendar.Date = Orders.OrderDate 
WHERE 
    Calendar.Date BETWEEN ??? AND ??? 
GROUP BY 
    Calendar.Date, 
    CardType.CCType 
1

를 강제로 쿼리를 주문 다시 할 수 있지만, 첫 번째 부분은 필요에 따라 교차 가입하지 않으므로 OP에서 주문을받은 모든 날짜에 모든 카드 유형을 요구할 수있는 시나리오가 생략됩니다. 대답과 함께 제공되는 코드 서식을 여전히 활용하고 싶기 때문에이 적절한 에티켓을 잘 모릅니다 ...

-- CREATE SAMPLE DATA 
CREATE TABLE #CCType (ID INT NOT NULL PRIMARY KEY, CCType VARCHAR(15) NOT NULL) 
INSERT #CCType VALUES (1, 'AMEX'), (2, 'VISA'), (3, 'MASTER CARD'), (4, 'OTHER') 
CREATE TABLE #Trans (TransID INT NOT NULL PRIMARY KEY, CCTypeID INT NOT NULL, Transactionname VARCHAR(15), OrderID INT NOT NULL) 
INSERT #Trans VALUES (1, 2, 'BIILPAY', 10), (2, 4, 'SECUREPAYMENT', 13), (3, 1, 'BIILPAY', 15) 
CREATE TABLE #Orders (OrderID INT NOT NULL PRIMARY KEY, OrderDate DATETIME NOT NULL, Product VARCHAR(10), TransID INT) 
INSERT #Orders VALUES (10, '20120227', 'Grapes', 1), (13, '20120226', 'Wine', 2), (14, '20120226', 'Pepper', 6), (15, '20120226', 'Apples', 1) 
-- END CREATE SAMPLE DATA 

SELECT OrderDate, 
     CCType, 
     COUNT(CASE WHEN ID = CCTypeID THEN 1 END) [Processed] 
FROM #CCType, #Orders, #trans 
WHERE #Orders.TransID = #Trans.TransID 
AND  #Orders.OrderID = #Trans.OrderID 
GROUP BY OrderDate, CCType, ID 
ORDER BY OrderDate DESC, ID 

-- DISPOSE OF SAMPLE DATA 
DROP TABLE #Orders, #CCType, #Trans 
+0

'GROUP BY'에'ID'를 넣을 수 있을지 확실하지 않습니까? – MatBailie

+0

@Dems 질문에있는 예에서 ID 순서대로 카드가 표시되므로 '주문'에 포함시킬 수 있습니다. – GarethD

관련 문제