несколько групп, считать и присоединиться - PullRequest
1 голос
/ 13 мая 2011

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

Table1 Пользователи:

  • ID
  • Имя
  • Счет

Table2 Game:

  • ID
  • Имя
  • Фолы

Таблица 3 Game2

  • ID
  • Имя
  • Фолы

В таблице 1 выберите всех пользователей.Затем выберите все данные, где Table1.Name = Table2.Name ИЛИ Table1.Name = Table3.Name, но с более высоким приоритетом для Table2, поэтому, если есть совпадение Table1.Name = Table2.Name, соединение из таблицы 3 не будет выполнено.Затем, когда я выбрал правильное значение, которое я также хотел бы посчитать общей суммой очков и фолов.

Как это делается в SQL и возможно ли это?Я использую MSSQL

Ответы [ 3 ]

2 голосов
/ 13 мая 2011
SELECT
  SUM(t1.Score) AS TotalScore,
  SUM(COALESCE(t2.Fouls, t3.Fouls)) AS TotalFouls
FROM Table1 t1
  LEFT JOIN Table2 t2 ON t2.Name = t1.Name
  LEFT JOIN Table3 t3 ON t3.Name = NULLIF(t1.Name, t2.Name)
0 голосов
/ 13 мая 2011

Вы можете одобрить присоединение к Таблице 2, указав в условии присоединение к Таблице3 Table2.Name IS NULL. Если вы хотите получить общий счет и количество фолов на игрока, вот как вы это сделаете:

SELECT derived_table.Name, SUM(derived_table.Score), SUM(derived_table.Fouls)
FROM (
    SELECT Name = Table1.Name, Score = Table1.Score,
        Fouls = COALESCE(Table2.Fouls, Table3.Fouls)
    FROM Table1
        LEFT OUTER JOIN Table2 ON Table2.Name = Table1.Name
        LEFT OUTER JOIN Table3 ON Table3.Name = Table1.Name
            AND Table2.Name IS NULL
    WHERE Table2.Name IS NOT NULL OR Table3.Name IS NOT NULL
    ) derived_table
GROUP BY derived_table.Name

Итого:

SELECT SUM(derived_table.Score), SUM(derived_table.Fouls)
FROM (
    SELECT Score = Table1.Score,
        Fouls = COALESCE(Table2.Fouls, Table3.Fouls)
    FROM Table1
        LEFT OUTER JOIN Table2 ON Table2.Name = Table1.Name
        LEFT OUTER JOIN Table3 ON Table3.Name = Table1.Name
            AND Table2.Name IS NULL
    WHERE Table2.Name IS NOT NULL OR Table3.Name IS NOT NULL
    ) derived_table
0 голосов
/ 13 мая 2011

Нижеследующее поможет вам в этом. Хотя я не уверен, что вам нужен агрегат для каждого пользователя или всего.

Кроме того - если у вас будут Game3, Game4 и т. Д., То лучше всего изменить дизайн стола, а не усложнять этот (и другие) запросы.

SELECT      SUM(U.Score) AS Score,
        SUM(Fouls.Fouls) AS Fouls
FROM        dbo.Users U
INNER JOIN  (
    SELECT      COALESCE(G.Name, G2.Name) AS Name,
            COALESCE(G.Fouls, G2.Fouls) AS Fouls
    FROM        dbo.Game G
    FULL JOIN   dbo.Game2 G2
    ON      G.Name = G2.Name
) Fouls
ON      U.Name = Fouls.Name
...