SQL:根据不同的WHERE条件两次选择同一表列

时间:2019-10-07 08:58:51

标签: sql sql-server

我已经在这里尝试了各种提议的解决方案,但是没有一个提议了我需要的解决方案。

我需要2个查询的一个结果,每个WHERE条件为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 个答案:

答案 0 :(得分:2)

您基本上有两个查询,然后在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

即您的两个查询作为子查询,并具有FULL OUTER JOIN。请注意,在第二个查询中,我添加了tbl_Abteilungen.Bezeichnung AS Abteilung作为SELECT列以使连接成为可能。

答案 1 :(得分:2)

如果在select子句中使用CASE语句,然后仅计算与date参数匹配的内容,则可以执行以下操作。

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 :(得分:0)

If both of the queries have the same Grouped by column use CTE's.

在下面的代码中,我构建了一个示例。

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;