簡體   English   中英

來自SQL中多個列的DISTINCT值

[英]DISTINCT values from multiple columns in sql

我有以下作業:

編寫一條SELECT語句,為每個姓氏和帳單地址與另一個客戶相同的客戶返回一行。 將結果集按姓氏和名字排序。

我嘗試使用DISTINCT關鍵字來執行此操作,但這不符合我的目的。

出於某種原因,每次我使用GROUP BY ,都會出現以下錯誤:

SELECT FirstName, LastName, BillingAddressID
    FROM Customers
    GROUP BY LastName;

選擇列表中的“ Customers.FirstName”列無效,因為它既不包含在聚合函數中,也不包含在GROUP BY子句中。

我嘗試了UNION並出現以下錯誤:

SELECT LastName FROM Customers

UNION 

SELECT BillingAddressID FROM Customers

將varchar值“ Sherwood”轉換為數據類型int時,轉換失敗。

有人可以指出我正確的方向嗎?

這是我正在處理的數據集的示例

firstname   lastname    billingaddressid  
Allan       Sherwood        2  
Barry       Zimmer          3  
Christine   Brown           4  
David       Goldstein       6  
Erin        Sherwood        7  
Frank Lee   Wilson          8  
Gary        Brown           4  
Heather     Esway           12  

因此,查詢應刪除姓氏的重復條目。

嘗試-

SELECT FirstName,
       Customers.LastName,
       Customers.billingAddressID
FROM Customers INNER JOIN
     ( SELECT LastName,
              billingAddressID
       FROM Customers
       GROUP BY LastName,
                billingAddressID
       HAVING COUNT( LastName ) >= 2 ) lastNameQuery
  ON Customers.LastName = lastNameQuery.LastName AND
     Customers.billingAddressID = lastNameQuery.billingAddressID
ORDER BY Customers.LastName,
         FirstName;

我針對使用以下腳本創建的數據庫進行了測試...

CREATE DATABASE Cust;

USE Cust;

CREATE TABLE Customers
(
    fldID               INT              NOT NULL    AUTO_INCREMENT,
    firstName           VARCHAR( 50 )    NOT NULL,
    lastName            VARCHAR( 50 ),
    billingAddressID    INT              NOT NULL,
    PRIMARY KEY ( fldID )
);

我使用-輸入了發問者的樣本數據

INSERT INTO Customers
SET firstName        = "Allan",
    lastName         = "Sherwood",
    billingAddressID = 2;

INSERT INTO Customers
SET firstName        = "Barry",
    lastName         = "Zimmer",
    billingAddressID = 3;

INSERT INTO Customers
SET firstName        = "Christine",
    lastName         = "Brown",
    billingAddressID = 4;

INSERT INTO Customers
SET firstName        = "David",
    lastName         = "Goldstein",
    billingAddressID = 6;

INSERT INTO Customers
SET firstName        = "Erin",
    lastName         = "Sherwood",
    billingAddressID = 7;

INSERT INTO Customers
SET firstName        = "Frank Lee",
    lastName         = "Wilson",
    billingAddressID = 8;

INSERT INTO Customers
SET firstName        = "Gary",
    lastName         = "Brown",
    billingAddressID = 10;

INSERT INTO Customers
SET firstName        = "Heather",
    lastName         = "Esway",
    billingAddressID = 12;

我還添加了以下內容,以確保重復使用lastName和billingAddressID ...

INSERT INTO Customers
SET firstName        = "Don",
    lastName         = "Sherwood",
    billingAddressID = 22;

INSERT INTO Customers
SET firstName        = "Timmy",
    lastName         = "Sherwood",
    billingAddressID = 22;

INSERT INTO Customers
SET firstName        = "James",
    lastName         = "Brown",
    billingAddressID = 22;

INSERT INTO Customers
SET firstName        = "James",
    lastName         = "Esway",
    billingAddressID = 22;

我們的發問者正在詢問的問題,我認為發問者正在尋求幫助的問題是-

Write a SELECT statement that returns one row for each customer that has the same last name and billing address as another customer. Sort the result set by last name then first name.

我對此的解釋是,我們應該為每個客戶返回符合以下條件的記錄:具有姓氏和與AT LEAST至少一個其他客戶共享的BillingAddressID的特定組合,並且返回記錄的列表應按姓氏排序並再分類在名字上。

我的答案的核心是細分-

SELECT LastName,
       billingAddressID
FROM Customers

從客戶中僅選擇兩個條件字段。

為此,我添加了-

GROUP BY LastName,
         billingAddressID

這會將核心細分結果細化為兩個條件字段的每個唯一組合的列表。

然后,我通過添加-將此列表限制為至少出現兩次的唯一組合。

HAVING COUNT( LastName ) >= 2

然后,我給結果查詢一個lastNameQuery的別名。

然后,我在兩個條件字段上都將lastNameQuery與Customers一起加入了Customers,以將我們的Customers列表限制為使用-使用一對共享的條件值的客戶

     Customers INNER JOIN
     ( SELECT LastName,
              billingAddressID
       FROM Customers
       GROUP BY LastName,
                billingAddressID
       HAVING COUNT( LastName ) >= 2 ) lastNameQuery
  ON Customers.LastName = lastNameQuery.LastName AND
     Customers.billingAddressID = lastNameQuery.billingAddressID

從中,我使用-選擇了所需的字段。

SELECT FirstName,
       Customers.LastName,
       Customers.billingAddressID
FROM

使用Customers. 由於需要澄清對CustomerslastNameQuery中都出現的字段名稱的引用,因此有必要。 沒有這種澄清,MySQL無法確定應使用哪些字段。

通過添加-將此列表按指定順序排序-

ORDER BY Customers.LastName,
         FirstName;

我通過測試完整的陳述而得到的結果是-

+-----------+----------+------------------+
| FirstName | LastName | billingAddressID |
+-----------+----------+------------------+
| Gary      | Brown    |               10 |
| Tom       | Brown    |               10 |
| Don       | Sherwood |               22 |
| Timmy     | Sherwood |               22 |
+-----------+----------+------------------+

這些是我的擴展樣本數據集中唯一在條件字段中具有值的共享組合的客戶。

嘗試這個

SQL小提琴

   SELECT * FROM 
    (
    SELECT *,ROW_NUMBER() OVER(PARTITION BY LASTNAME ORDER BY FIRSTNAME) AS RN
    FROM YOURTABLE
    )T
    WHERE RN=2

如果要返回所有唯一記錄。

SELECT * FROM 
    (
    SELECT *,ROW_NUMBER() OVER(PARTITION BY LASTNAME ORDER BY FIRSTNAME) AS RN
    FROM YOURTABLE
    )T
    WHERE RN=1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM