Присоединение к таблицам, но отображение всех значений справочной таблицы - PullRequest
2 голосов
/ 28 февраля 2012

У меня есть справочная таблица, в основном с типами кредитных карт

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

Затем у меня есть другая таблица с транзакциями, где CCTypeID является идентификатором в справочной таблице

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, сгруппированные поORDER.DATE и CardType, но они только показывают, где бы ни были значения, есть ли способ сделать так, чтобы они все еще перечисляли типы кредитных карт, независимо от того, есть ли транзакции или заказы на дату?просто показать ноль для этого типа карты?

Буду благодарен за помощь.

Ответы [ 2 ]

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

Ваш базовый запрос должен выглядеть примерно так ...

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

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