SQL: выбор одного и того же столбца таблицы дважды в зависимости от условий WHERE - PullRequest
3 голосов
/ 07 октября 2019

Я уже пробовал различные предлагаемые здесь решения, но ни один из них не предложил то, что мне нужно.

Мне нужен один результат из 2 запросов с каждым условием ГДЕ 1 таблицы. Нет результата союза, пожалуйста. Оба результата запроса должны быть в разных столбцах, упакованных в один результат. Позвольте мне показать вам, что я имею в виду:

Запрос 1:

This is the result from the first query

SELECT 
    tbl_Abteilungen.Bezeichnung AS Abteilung, 
    COUNT(tbl_Abteilungen.abteilungen_id) AS [Offene Abteilungstermine] 
FROM 
    tbl_Lieferschein
INNER JOIN 
    tbl_Positionen ON tbl_Lieferschein.lieferschein_id = tbl_Positionen.id_lieferschein
INNER JOIN 
    tbl_Positionen_Abteilungen ON tbl_Positionen.positionen_id = tbl_Positionen_Abteilungen.id_positionen
INNER JOIN 
    tbl_Abteilungen ON tbl_Positionen_Abteilungen.id_abteilungen = tbl_Abteilungen.abteilungen_id
WHERE 
    tbl_Positionen_Abteilungen.fertiggestellt = 0 
    AND tbl_Lieferschein.fertiggestellt = 0 
    AND tbl_Lieferschein.gelöscht = 0
GROUP BY 
    tbl_Abteilungen.Bezeichnung

Запрос 2:

This is the result from the second query

SELECT 
    COUNT(tbl_Abteilungen.abteilungen_id) AS [Überfällige Abteilungstermine] 
FROM
    tbl_Lieferschein
INNER JOIN 
    tbl_Positionen ON tbl_Lieferschein.lieferschein_id = tbl_Positionen.id_lieferschein
INNER JOIN 
    tbl_Positionen_Abteilungen ON tbl_Positionen.positionen_id = tbl_Positionen_Abteilungen.id_positionen
INNER JOIN 
    tbl_Abteilungen ON tbl_Positionen_Abteilungen.id_abteilungen = tbl_Abteilungen.abteilungen_id
WHERE 
    tbl_Positionen_Abteilungen.fertiggestellt = 0 
    AND tbl_Lieferschein.fertiggestellt = 0 
    AND tbl_Lieferschein.gelöscht = 0 
    AND tbl_Positionen_Abteilungen.Abteilungstermin < CAST(GETDATE() AS DATE)
GROUP BY 
    tbl_Abteilungen.Bezeichnung

Все, что мне нужно, это результат, подобный следующему:

Необходимый результат:

Needed result

PS: Лучше всего было бы, если бы все нулевые результаты отображались как '0'

Ответы [ 3 ]

2 голосов
/ 07 октября 2019

Вы можете сделать это, если вы используете оператор CASE в предложении select и затем учитываете только те из них, которые соответствуют вашему параметру даты, как показано ниже.

SELECT Abteilung, 
        SUM([Offene Abteilungstermine]) AS [Offene Abteilungstermine],
        SUM([Überfällige Abteilungstermine]) AS [Überfällige Abteilungstermine]
FROM (
    SELECT tbl_Abteilungen.Bezeichnung AS Abteilung,
        [Offene Abteilungstermine] = 1,
        [Überfällige Abteilungstermine] = 
                CASE WHEN tbl_Positionen_Abteilungen.Abteilungstermin < CAST(GETDATE() AS DATE)
                                THEN 1
                    ELSE 0 END
    FROM tbl_Lieferschein
    INNER JOIN tbl_Positionen ON tbl_Lieferschein.lieferschein_id = tbl_Positionen.id_lieferschein
    INNER JOIN tbl_Positionen_Abteilungen ON tbl_Positionen.positionen_id = tbl_Positionen_Abteilungen.id_positionen
    INNER JOIN tbl_Abteilungen ON tbl_Positionen_Abteilungen.id_abteilungen = tbl_Abteilungen.abteilungen_id
    WHERE tbl_Positionen_Abteilungen.fertiggestellt = 0 
    AND tbl_Lieferschein.fertiggestellt = 0 
    AND tbl_Lieferschein.gelöscht = 0
) counts
GROUP BY Abteilung
2 голосов
/ 07 октября 2019

По сути, у вас есть два запроса, которые вы затем объединяете вместе на tbl_Abteilungen.Bezeichnung

Так вот так:

SELECT ISNULL(A.Abteilung, B.Abteilung) AS Abteilung, ISNULL(A.[Offene Abteilungstermine],0) AS [Offene Abteilungstermine], 
    ISNULL(B.[Überfällige Abteilungstermine],0) AS [Überfällige Abteilungstermine]
FROM (SELECT tbl_Abteilungen.Bezeichnung AS Abteilung, 
      COUNT(tbl_Abteilungen.abteilungen_id) AS [Offene Abteilungstermine] 
      FROM tbl_Lieferschein
      INNER JOIN tbl_Positionen ON tbl_Lieferschein.lieferschein_id =           tbl_Positionen.id_lieferschein
      INNER JOIN tbl_Positionen_Abteilungen ON tbl_Positionen.positionen_id = tbl_Positionen_Abteilungen.id_positionen
      INNER JOIN tbl_Abteilungen ON tbl_Positionen_Abteilungen.id_abteilungen = tbl_Abteilungen.abteilungen_id
      WHERE tbl_Positionen_Abteilungen.fertiggestellt = 0 
      AND tbl_Lieferschein.fertiggestellt = 0 
      AND tbl_Lieferschein.gelöscht = 0
      GROUP BY tbl_Abteilungen.Bezeichnung) A
FULL OUTER JOIN
      (SELECT tbl_Abteilungen.Bezeichnung AS Abteilung, COUNT(tbl_Abteilungen.abteilungen_id) AS [Überfällige Abteilungstermine] 
      FROM tbl_Lieferschein
      INNER JOIN tbl_Positionen ON tbl_Lieferschein.lieferschein_id = tbl_Positionen.id_lieferschein
      INNER JOIN tbl_Positionen_Abteilungen ON tbl_Positionen.positionen_id = tbl_Positionen_Abteilungen.id_positionen
      INNER JOIN tbl_Abteilungen ON tbl_Positionen_Abteilungen.id_abteilungen = tbl_Abteilungen.abteilungen_id
      WHERE tbl_Positionen_Abteilungen.fertiggestellt = 0 
      AND tbl_Lieferschein.fertiggestellt = 0 
      AND tbl_Lieferschein.gelöscht = 0 AND tbl_Positionen_Abteilungen.Abteilungstermin < cast(GETDATE() AS DATE)
      GROUP BY tbl_Abteilungen.Bezeichnung) B
ON A.Abteilung = B.Abteilung

т.е. ваши два запроса как подзапросы, с полнымНАРУЖНОЕ СОЕДИНЕНИЕ. Обратите внимание, что во втором запросе я добавил tbl_Abteilungen.Bezeichnung AS Abteilung в качестве столбца SELECT, чтобы сделать возможным соединение.

0 голосов
/ 07 октября 2019

Если оба запроса имеют одинаковые сгруппированные по столбцу, используйте CTE.

В приведенном ниже коде я построил пример.

WITH ds1
 AS (SELECT s.CustomerID, 
            SUM(s.Quantity) AS TotalQuantity
     FROM dbo.Sales s
     WHERE s.Quantity > 700
     GROUP BY s.CustomerID),
 ds2
 AS (SELECT s.CustomerID, 
            COUNT(1) AS NR, 
            SUM(s.Quantity) AS TotalQuantity
     FROM dbo.Sales s
     WHERE s.Quantity < 500
     GROUP BY s.CustomerID)
 SELECT c.FirstName, 
        c.LastName, 
        d.TotalQuantity QuantityFrom1stQuery, 
        d2.TotalQuantity QuantityFrom2ndQuery
 FROM dbo.Customers c
      JOIN ds1 d ON d.CustomerID = c.CustomerID
      JOIN ds2 d2 ON d2.CustomerID = c.CustomerID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...